NSManagedObject 上的 Swift 扩展以返回实例类型 [重复]
Posted
技术标签:
【中文标题】NSManagedObject 上的 Swift 扩展以返回实例类型 [重复]【英文标题】:Swift extension on NSManagedObject to return instancetype [duplicate] 【发布时间】:2014-07-18 20:05:24 【问题描述】:假设我有一个托管对象Word
,我希望能够调用
var w = Word.create(context)
所以我定义了以下扩展:
extension NSManagedObject
class func create(context:NSManagedObjectContext) -> NSManagedObject
var classname = NSStringFromClass(self)
var object = NSEntityDescription.insertNewObjectForEntityForName(classname, inManagedObjectContext: context) as NSManagedObject
return object
但是,它并没有按预期工作。
NSStringFromClass
返回胡言乱语,例如“_TtC8WordApp4Word”,我想不出一个 Swift 等价物
返回类型是NSManagedObject
,当它应该是Self
,但将Self
放在那里不会编译。
有没有办法做我想做的事?
【问题讨论】:
【参考方案1】:关于 (1):埃文·斯威克 (Evan Swick) 对这些错误的名字有所了解:http://www.eswick.com/2014/06/inside-swift/
请参阅 [this answer][1] 以获得很好的解释。
“_TtC8WordApp4Word”:您必须提取该字符串的最后一部分并将其用于entityName
参数。
【讨论】:
哪里有好的解释? @Emil 似乎被删除了 :-(【参考方案2】:到目前为止我发现的最好的方法是这样,我仍然宁愿不必将类型传递给函数,但这种方法并没有成功
extension NSManagedObject
class func create <T: NSManagedObject>(type: T.Type, context:NSManagedObjectContext) -> T
var classname = NSStringFromClass(type).pathExtension
return NSEntityDescription.insertNewObjectForEntityForName(classname, inManagedObjectContext: context) as T
NSManagedObject.create(Word.self, context:moc)
【讨论】:
这是一个可能的解决方案,不需要将类型传递给函数:***.com/a/27112385/1187415。 @MartinR 有趣的是,当我上次尝试时它不起作用。一直抱怨 T 和 Self 不一样以上是关于NSManagedObject 上的 Swift 扩展以返回实例类型 [重复]的主要内容,如果未能解决你的问题,请参考以下文章
在 Xcode 10.2 上的 Swift4.2 中插入 NSManagedObject 后,我会立即收到 Xcode 构建错误
将我的 NSManagedObject 子类与我的 ViewController.swift 连接起来
SWIFT CoreData NSManagedObject
NSManagedObject 不能符合 Swift 中的协议
“filename+CoreDataProperties.swift”和“filename.swift”NSmanagedObject 子类有啥用?