Я был очень рад найти реализацию Swift 3 от #keyPath()
, что позволит устранить опечатки и обеспечить соблюдение во время компиляции, что путь ключа фактически существует. Гораздо лучше, чем вручную набирать строки.Можно ли сохранить независимое имя свойства, переданное в #keyPath(), независимо?
https://github.com/apple/swift-evolution/blob/master/proposals/0062-objc-keypaths.md
class MyObject {
@objc var myString: String = "default"
}
// Works great
let keyPathString = #keyPath(MyObject.myString)
Swift docs list the type передается в #keyPath()
как "имя свойства".
Имя свойства должен быть ссылкой на свойство, которое доступно во время выполнения Objective-C. Во время компиляции выражение ключевого пути заменяется строковым литералом.
Можно ли сохранить это «имя свойства» самостоятельно, а затем перейти к #keyPath()
, чтобы создать строку?
let propertyName = MyObject.myString // error. How do I save?
let string = #keyPath(propertyName)
Есть ли какая-либо поддержка в требовании названия свойства, принадлежащего определенному типу?
// something like this
let typedPropertyName: MyObject.PropertyName = myString // error
let string = #keyPath(typedPropertyName)
Конечная цель будет взаимодействовать с с API, которые требуют NSExpression
для ключевого пути. Я хотел бы написать удобные методы, которые принимают правильное имя свойства как параметр, а не случайные строки пути ключа. В идеале, имя свойства, реализованное определенным типом.
func doSomethingForSpecificTypeProperty(_ propertyName: MyObject.PropertyName) {
let keyPathString = #keyPath(propertyName)
let expression = NSExpression(forKeyPath: keyPathString)
// ...
}
Swift 4 в [Смарт KeyPaths: кодирование Better Key-Value для Swift] (HTTPS://github.com/apple/swift-evolution/blob/master/proposals/0161-key-paths.md), кажется, добавляет лучший вариант. Примите этот ответ, если кто-то захочет написать его до того, как я доберусь до него. – pkamb
https://bugs.swift.org/browse/SR-5220 - «Expose API для извлечения строкового представления KeyPath» – pkamb
https://github.com/kishikawakatsumi/Kuery - «API-интерфейс запроса на основные типы данных, использующий Swift 4's Smart KeyPaths " – pkamb