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