NSManagedObject上的Swift扩展以返回instancetype

时间:2014-07-18 20:05:25

标签: swift

假设我有一个托管对象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
    }
}

但是,它无法按预期工作。

  1. NSStringFromClass返回乱码,就像'_TtC8WordApp4Word'一样,我无法弄清楚Swift的等价物
  2. 返回类型为NSManagedObject,它应该类似于Self,但将Self放在那里就不会编译。
  3. 有没有办法做我想做的事情?

2 个答案:

答案 0 :(得分:0)

关于(1):Evan Swick对错位名称有所了解:http://www.eswick.com/2014/06/inside-swift/

请参阅[本回答] [1]以获得更好的解释。

“_ TtC8WordApp4Word”:您必须提取该字符串的最后一部分并将其用于entityName参数。

答案 1 :(得分:0)

到目前为止,我发现的最好方法是,我仍然不必将类型传递给函数,但是使用该方法并没有成功

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)