当我遇到奇怪的事情时,我试图使用KeyPath
访问子类成员。看一下这两个简单的类:
class A {
var a:String {
get {
return "str"
}
}
}
class B: A {
override var a:String {
get {
return "str1"
}
}
var c = 10
}
现在,如果我有以下代码:
var m: A = B()
var k = \B.a
print(m[keyPath: k])
我将收到运行时错误。看来您无法使用WriteableKeyPath
访问子类成员。但是以下代码有效:
var m: A = B()
var k: AnyKeyPath = \B.a
print(m[keyPath: k]!)
我可以使用此代码访问\B.a
和\B.c
。知道为什么会这样吗?
由于使用AnyKeyPath
返回的对象是不可变的,因此我将无法使用它来更新对象。我想知道是否存在使用父类上的KeyPath
更新子类成员的解决方法。
更新:
为了详细说明,这是另一个示例:
var v: UIView = UILabel()
var k = \UILabel.text
v[keyPath: k] = "test" // Error cannot do this
我认为这可能非常有用。