Swift 3の実装である#keyPath()
が見つかりました。これは、誤った入力を排除し、コンパイル時にキーパスが実際に存在するように強制します。手動で文字列を入力するよりもはるかに優れています。 "プロパティ名" として#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)
プロパティ名は、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)
最終目標は、キーパスのNSExpression
が必要なAPIでと対話します。私は、ランダムなキーパス文字列ではなく、パラメータとして有効なProperty Nameをとる便利なメソッドを記述したいと考えています。理想的には、特定のタイプによって実装されるプロパティ名。
func doSomethingForSpecificTypeProperty(_ propertyName: MyObject.PropertyName) {
let keyPathString = #keyPath(propertyName)
let expression = NSExpression(forKeyPath: keyPathString)
// ...
}
スウィフト4の[スマートキーパス:スウィフトのためのコーディングより良いキー値](HTTPS:/あなたはSWIFT 4で、このための短いコードは次のようになります
これらの目的のために、一般的なキーパスを使用することができます/github.com/apple/swift-evolution/blob/master/proposals/0161-key-paths.md)より良いオプションが追加されているようです。もし誰かがそれに着く前にそれを書いておきたいなら、その答えを受け入れるでしょう。 – pkamb
https://bugs.swift.org/browse/SR-5220 - 「KeyPathの文字列表現を取得するAPIを公開する」 – pkamb
https://github.com/kishikawakatsumi/Kuery - 「タイプセーフなコアデータクエリAPIです。 Swift 4のスマートKeyPaths " – pkamb