我很高兴找到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作为"property name"被传递到 #keyPath()
.
属性名称必须是对Objective-C运行时中可用的属性的引用 . 在编译时,键路径表达式由字符串文字替换 .
是否有可能独立保存此"property name",然后传递给 #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进行交互 . 我想编写方便的方法,将有效的属性名称作为参数,而不是随机密钥路径字符串 . 理想情况下,由特定类型实现的属性名称 .
func doSomethingForSpecificTypeProperty(_ propertyName: MyObject.PropertyName) {
let keyPathString = #keyPath(propertyName)
let expression = NSExpression(forKeyPath: keyPathString)
// ...
}
2 回答
它看起来不可能 .
这是解析密钥路径表达式的编译器代码:
此代码首先在括号内创建一个以句点分隔的名称列表,然后尝试将它们解析为表达式 . 它接受表达式而不是任何Swift类型的数据;它接受代码,而不是数据 .
刚提出类似的问题,发现this article . 您可以将 KeyPath generic用于这些目的
swift 4中的短代码如下所示: