Переопределение обобщенных и расширенных функций Swift
Возникла странная проблема с генериками на Swift
иметь NSManagedObject
иерархия подклассов с расширениями:
BaseCloudKitItem <-MyObject
extension BaseCloudKitItem {
func updateDataWithCKRecord(record: CKRecord!, inManagedObjectContext context: NSManagedObjectContext!) {
cloudKitRecordID = record?.recordID.recordName
cloudKitType = record?.recordType
println("\(self) updateDataWithCKRecord:inManagedObjectContext: called")
}
}
extension MyObject {
override func updateDataWithCKRecord(record: CKRecord!, inManagedObjectContext context: NSManagedObjectContext!) {
super.updateDataWithCKRecord(record, inManagedObjectContext: context)
title = record?.objectForKey("title") as? NSString
}
}
иметь общий класс:
class CloudFetcher<T : BaseCloudKitItem> {
class func someFetchingAndMappingMethod(completion:(() -> Void)?) {
someFetchingMethodWithCompletion { (records, error) in
if let err = error {
completion?(nil, err)
} else {
NSManagedObjectContext.saveDataInBackgroundWithBlock({ (localContext) in
T.deleteAllInContext(localContext)
for record in records {
let object = T.createEntityInContext(localContext) as T
object.updateDataWithCKRecord(record, inManagedObjectContext: localContext)
}
}, completion: completion)
}
}
}
}
и использование:
CloudFetcher<MyObject>.someFetchingAndMappingMethod { _ in
}
Пройденный класс в общий CloudFetcher
является MyObject
Итак, проблема в том, что я обнаружил, что методы, вызываемые внутри общего из базового класса BaseCloudKitItem
не из MyObject
, Если я изменю объявление интерфейса CloudFetcher с class CloudFetcher<T : BaseCloudKitItem>
в class CloudFetcher<T : MyObject>
он отлично работает, но нет смысла использовать дженерики таким образом.
Также в логах от println()
внутри целевого метода я вижу нужный класс, но нужный метод все еще не вызывается:
<MyObject: 0x7aab7130> (entity: MyObject; id: 0x802f5bf0 <x-coredata:///InstrumentToken/t1AAF2438-9DF7-44DA-89B2-C3C1BE3D91FE17> ; data: {
cloudKitRecordID = "fb4fac88-40e5-4aef-af3c-6e36867dbf5f";
cloudKitType = MyObject;
title = nil;
}) updateDataWithCKRecord:inManagedObjectContext: called
Это выглядит довольно странно для меня, может быть, кто-то может предложить мне, как я могу решить это?
Спасибо!