我有一个似乎应该工作的简单示例:
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?()
导致错误:
Expected member name or constructor call after type name
知道我做错了什么吗?
编辑
从声明中删除单词@optional并稍微更改函数允许代码编译,但现在我收到运行时错误,说明了
‘Swift dynamic cast Failed’
@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: return Array of type 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)