核心数据 – 使用Swift协议和泛型
发布时间:2020-12-14 05:47:45 所属栏目:百科 来源:网络整理
导读:我有一个似乎应该工作的简单示例: import CoreData@objc protocol CoreDataModel { @optional class func entityName() - String}class AbstractModel: NSManagedObject,CoreDataModel { class func createT : CoreDataModel(context:NSManagedObjectContex
我有一个似乎应该工作的简单示例:
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) 或者,您可以使用答案中的方法 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) (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |