使用KeyPath访问子类成员

时间:2018-12-30 10:10:27

标签: swift swift-keypath

当我遇到奇怪的事情时,我试图使用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

我认为这可能非常有用。

0 个答案:

没有答案