gpt4 book ai didi

core-data - 将 Swift 协议(protocol)与泛型一起使用

转载 作者:行者123 更新时间:2023-11-28 09:20:41 24 4
gpt4 key购买 nike

我有一个看起来应该可行的简单示例:

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 协议(protocol),并且 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
}
}

最佳答案

我无法解释为什么您的代码会导致运行时异常。但如果你改变它会起作用函数原型(prototype)

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

假设你的托管对象子类符合协议(protocol),例如

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)

关于core-data - 将 Swift 协议(protocol)与泛型一起使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24834753/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com