【发布时间】:2017-06-26 15:23:36
【问题描述】:
我很高兴找到 Swift 3 的 #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 运行时可用的属性的引用。在编译时,key-path 表达式被字符串文字替换。
是否可以独立保存这个“属性名”,然后传递给#keyPath()创建一个String?
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 进行交互。我想编写将有效属性名称作为参数的便捷方法,而不是随机键路径字符串。理想情况下,由特定类型实现的属性名称。
func doSomethingForSpecificTypeProperty(_ propertyName: MyObject.PropertyName) {
let keyPathString = #keyPath(propertyName)
let expression = NSExpression(forKeyPath: keyPathString)
// ...
}
【问题讨论】:
-
Swift 4 的Smart KeyPaths: Better Key-Value Coding for Swift 似乎增加了一个更好的选择。如果有人想在我开始之前写下来,我会接受这个答案。
-
bugs.swift.org/browse/SR-5220 - "公开 API 以检索 KeyPath 的字符串表示形式"
-
github.com/kishikawakatsumi/Kuery - “使用 Swift 4 的 Smart KeyPaths 的类型安全核心数据查询 API”
标签: swift key-value-observing kvc keypaths