Я пытаюсь создать какого-нибудь насмешливого помощника. Для этого я создал класс с @dynamicMemberLookup
. И мне нужно преобразовать swift keypath в Objective- C string keypath для @objc
свойств в subscript(dynamicMember:)
.
@dynamicMemberLookup
public class Mock<T> where T: NSObject {
public subscript<Z>(dynamicMember keyPath: KeyPath<T, Z>) -> Z {
get { fatalError() }
set {
debugPrint("kvc \(keyPath._kvcKeyPathString ?? "nil!")")
}
}
}
Я использую свойство _kvcKeyPathString
для получения имени свойства из keypath. Это работает, если я передаю keypath следующим образом:
mock[dynamicMember: \TestObject.test] = 1
Но это не работает, если я вызываю так:
mock.test = 1
Также интересно, что если я сохраню оба keypath и сравниваю их, swift говорит, что keypath1 == keypath2
.
Весь код печатает это:
"kvc nil!"
"kvc test"
@dynamicMemberLookup
public class Mock<T> where T: NSObject {
public subscript<Z>(dynamicMember keyPath: KeyPath<T, Z>) -> Z {
get { fatalError() }
set {
debugPrint("kvc \(keyPath._kvcKeyPathString ?? "nil!")")
}
}
}
@objc public class TestObject: NSObject {
@objc public var test: Int { return 0 }
}
let mock = Mock<TestObject>()
mock.test = 1
mock[dynamicMember: \TestObject.test] = 1
Знаете ли вы, почему для первого пути к ключу он не получает строковый путь к ключу? И как получить test
имя свойства в таком случае?
Я прикрепил целую площадку