核心数据 – 使用Swift协议和泛型

前端之家收集整理的这篇文章主要介绍了核心数据 – 使用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?()

导致错误

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)

猜你在找的Swift相关文章