1

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

我认为这可能非常有用。

4

0 回答 0