У меня есть класс Core Data List
, унаследованный от абстрактного типа Synchronizable
.Последний является родительским для нескольких других классов, которые я намерен синхронизировать с моим сервером.
Я хотел бы добавить функцию класса в Synchronizable
, которая возвращает объект с определенным идентификатором на сервере:
class func withIDOnServer(_ pk:String, inMOC context:NSManagedObjectContext -> Self?
и используйте его как
List.withIDOnServer(pk:"1234", context)
У меня проблема в том, что я не могу привести результат к типу дочернего класса.Вот мой код:
extension Synchronizable {
// return the object with ID xxx on server.
class func withIDOnServer(_ pk:String, inMOC context:NSManagedObjectContext) throws -> Self? {
let entityName = String(describing: self)
let request = NSFetchRequest<NSFetchRequestResult>(entityName: entityName)
request.predicate = NSPredicate(format:"'pk' = %@", pk)
do {
let results = try context.fetch(request) as! [Self]
guard results.count == 1 else {
if results.count > 1 {
throw fetchError.moreThanOne(pk: pk)
}
else { // results.count == 0
return nil
}
}
return results.first as! Self?
}
catch let error {
throw fetchError.cannotFetch(error.localizedDescription)
}
}
}
Проблема заключается в использовании Self
в теле функции.(Я также попробовал Self?
и type(of:self)
, не повезло) Как я могу вернуть объект того же типа, что и дочерний класс?Это единственный способ использовать протокол (где Self
разрешено в теле функции)?