加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

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

导致错误:

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)

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读