将Swift协议与泛型一起使用
我有一个简单的示例,它似乎应该工作:
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
}
}
因此,我们有一个名为的类AbstractModel
,它符合协议CoreDataModel
,并CoreDataModel
定义了一个可选的类方法entityName
。
但是,这一行:
var name = T.entityName?()
导致错误:
类型名称后的预期成员名称或构造函数调用
知道我在做什么错吗?
编辑
@optional
从声明中删除单词并稍微更改函数可以使代码得以编译,但是现在我遇到了运行时错误,指出
“快速动态投放失败”
@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
}
}
回答:
我无法解释为什么您的代码会导致运行时异常。但是,如果您更改函数原型,它将起作用
class func create<T : CoreDataModel>(aClass:T.Type, context:NSManagedObjectContext) -> T
至
class func create<T : NSManagedObject where T: CoreDataModel>(aClass:T.Type, context:NSManagedObjectContext) -> T
假设您的托管对象子类符合协议,例如
extension Event : CoreDataModel { class func entityName() -> String {
return "Event"
}
}
然后工作并创建一个新对象:
let newManagedObject = AbstractModel.create(Event.self, context: context)
或者,您可以使用从答案到“Swift:返回类型为self的数组”的方法,并定义NSManagedObjectContext
该类的扩展:
extension NSManagedObjectContext { func create<T : NSManagedObject where T : CoreDataModel >(entity: T.Type) -> T {
var classname = entity.entityName()
var object = NSEntityDescription.insertNewObjectForEntityForName(classname, inManagedObjectContext: self) as T
return object
}
}
然后将创建一个新对象
let newManagedObject = context.create(Event.self)
以上是 将Swift协议与泛型一起使用 的全部内容, 来源链接: utcz.com/qa/406543.html