Доступ к членам подкласса с помощью KeyPath - PullRequest
0 голосов
/ 30 декабря 2018

Я пытался получить доступ к членам подкласса, используя KeyPath, когда столкнулся с чем-то странным.Посмотрите на эти 2 простых класса:

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

Я думаю, что это может быть очень полезно.

...