Я пытался получить доступ к членам подкласса, используя 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
Я думаю, что это может быть очень полезно.