在约束协议扩展中的swift Core Data KVO中模糊地使用setValueForKey

时间:2015-12-28 06:56:22

标签: core-data swift2 key-value-observing protocol-extension

我有以下代码

protocol JsonParseDescriptor {
 //some required methods
   func parsePrimitives() {
}

extension JsonParseDescriptor where Self: NSManagedObject {
   func parsePrimitives() {
      self.setValue(1, forKey: "id") //this throws an error in swift stating Ambiguous use of setValueForKey
      self.setValue(1, forKey: "id") //this does not throw any compile-time error
   }

}

任何想法为什么setValue:ForKey:导致此错误?有趣的是,setValue:ForKeyPath:不会导致此问题。我只是害怕使用后者,因为它导致任何副作用,并且除了setValue之外还有效:ForKey:有什么想法吗?

1 个答案:

答案 0 :(得分:0)

这是导致错误的代码。

func create<U : NSManagedObject>(entityName : String, primaryKey : String, value : AnyObject) -> U {
    let created : U = NSEntityDescription.insertNewObjectForEntityForName(entityName, inManagedObjectContext: providedContext) as! U
    created.setValue(value, forKey: primaryKey)
    return created
}

这是创建它的代码:

func create<U : NSManagedObject>(entityName : String, primaryKey : String, value : AnyObject) -> U {
    let created = NSEntityDescription.insertNewObjectForEntityForName(entityName, inManagedObjectContext: providedContext)
    created.setValue(value, forKey: primaryKey)
    return created as! U
}

我的猜测是编译器(或静态分析器)无法确定应该路由动态分派的位置。或许它只是一个错误。

无论哪种方式,我希望这种解决方法有所帮助。