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
。知道为什么会这样吗?
由于 using 返回的对象AnyKeyPath
是不可变的,我将无法使用它来更新对象。我想知道是否有任何解决方法可以使用KeyPath
父类更新子类成员。
更新:
为了详细说明,这里再举一个例子:
var v: UIView = UILabel()
var k = \UILabel.text
v[keyPath: k] = "test" // Error cannot do this
我认为这可能非常有用。