Swift:布尔属性和KVC之谜

时间:2016-02-16 17:27:14

标签: swift core-data boolean kvc

所以我正在玩这个简单的CoreData实体

import CoreData

class Figure: NSManagedObject {
    @NSManaged var approx: NSNumber? // Defined as Boolean type without default value
}

正如您所料,对于一个新的数字,你得到

figure.approx # nil
figure.valueForKey("approx") # nil

但是,如果您定义以下内容(是的,我知道,我可以在数据模型中设置默认值,这不是重点)

var isApprox: Bool {
  guard let approx = approx else { return false }
  return approx == true
}

然后突然

figure.valueForKey("approx") # false

好吧,对某些(对我而言)神秘的原因,它实际上依赖的是isApprox。我假设它是合成的,并且我在不知不觉中覆盖了它,但是如果你删除isApprox声明并尝试使用KVC调用它,它会崩溃:

figure.valueForKey("isApprox") # Execution was interrupted

如果您有以下内容,请继续:

class Figure: NSManagedObject {
    @NSManaged var approx: NSNumber?

    var isApproximate: Bool {
      guard let approx = approx else { return false }
      return approx == true
    }
}

现在你得到了

figure.valueForKey("approx") # nil - expected
figure.valueForKey("isApproximate") # false - expected
figure.valueForKey("approximate") # false - where does this one come from?
figure.isApprox # error: value of type 'Figure' has no member 'isApprox'

我无法找到任何关于此的文档,我很想知道发生了什么。

1 个答案:

答案 0 :(得分:1)

我认为“键值编码参考手册”中的this article涵盖了您注意到的行为。

具体来说,标题为“valueForKey的默认搜索模式:”的部分表示对于给定的键,valueForKey:将尝试一系列不同的访问器方法,包括“key”和“isKey”(有趣的是,它会在其中任何一个之前尝试“getKey”。