Swift:布尔属性与KVC之谜

Swift: Boolean attributes and KVC mysteries

所以我正在玩这个简单的 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'

我找不到任何相关文档,我很想知道发生了什么。

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

具体来说,标题为 "Default Search Pattern for valueForKey:" 的部分表示对于给定的键,valueForKey: 将尝试一系列不同的访问器方法,包括 "key" 和 "isKey"(有趣的是, 它会先尝试 "getKey"。