Получить имя свойства из быстрой клавиши в нижнем индексе (dynamicMember :) - PullRequest
0 голосов
/ 20 апреля 2020

Я пытаюсь создать какого-нибудь насмешливого помощника. Для этого я создал класс с @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 имя свойства в таком случае?

Я прикрепил целую площадку

...