Usar protocolos Swift con genéricos
Tengo un ejemplo simple que parece que debería funcionar:
import CoreData
@objc protocol CoreDataModel {
@optional class func entityName() -> String
}
class AbstractModel: NSManagedObject, CoreDataModel {
class func create<T : CoreDataModel>(context:NSManagedObjectContext) -> T {
var name = T.entityName?()
var object = NSEntityDescription.insertNewObjectForEntityForName(name, inManagedObjectContext: context) as T
return object
}
}
Entonces tenemos una clase llamadaAbstractModel
que se ajusta al protocoloCoreDataModel
yCoreDataModel
define un método de clase opcional llamadoentityName
.
Sin embargo, esta línea:
var name = T.entityName?()
causa el error:
Nombre de miembro esperado o llamada de constructor después del nombre de tipo
¿Alguna idea de lo que estoy haciendo mal?
EditarQuitando la palabra@optional
de la declaración y cambiar un poco la función permite que el código se compile, pero ahora aparece un error de tiempo de ejecución que dice que el
'Falló el lanzamiento dinámico rápido'
@objc protocol CoreDataModel {
class func entityName() -> String
}
class AbstractModel: NSManagedObject, CoreDataModel {
class func entityName() -> String {
return "AbstractModel"
}
class func create<T : CoreDataModel>(aClass:T.Type, context:NSManagedObjectContext) -> T {
var name = aClass.entityName()
var object = NSEntityDescription.insertNewObjectForEntityForName(name, inManagedObjectContext: context) as T
return object
}
}