核心数据 – 使用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)

相关文章

软件简介:蓝湖辅助工具,减少移动端开发中控件属性的复制和粘...
现实生活中,我们听到的声音都是时间连续的,我们称为这种信...
前言最近在B站上看到一个漂亮的仙女姐姐跳舞视频,循环看了亿...
【Android App】实战项目之仿抖音的短视频分享App(附源码和...
前言这一篇博客应该是我花时间最多的一次了,从2022年1月底至...
因为我既对接过session、cookie,也对接过JWT,今年因为工作...