如何在运行时获取KeyPath的字符串形式名称?
Swift中获取KeyPath的运行时文本名称
在Swift中,官方并没有提供直接获取KeyPath文本名称的API,但可以通过一些间接方式实现需求:
方法一:解析KeyPath的debugDescription
利用Swift中KeyPath的debugDescription包含路径信息的特性,我们可以写一个扩展来提取路径:
extension KeyPath { /// 获取完整路径名称(如"\Foo.value") var fullPathName: String { let debugDesc = self.debugDescription guard let start = debugDesc.firstIndex(of: "("), let end = debugDesc.lastIndex(of: ")") else { return "" } return String(debugDesc[debugDesc.index(after: start)..<end]) } /// 获取仅属性名称(如"value") var propertyName: String { return fullPathName.split(separator: ".").last.map(String.init) ?? "" } }
使用示例:
struct Foo { let value: Int } let keyPath = \Foo.value print(keyPath.fullPathName) // 输出 "\Foo.value" print(keyPath.propertyName) // 输出 "value"
注意:这种方法依赖于Swift内部对debugDescription的格式实现,属于未公开的细节,未来版本可能会发生变化,生产环境使用需谨慎。
方法二:Objective-C兼容类型使用#keyPath指令
如果你的类型是Objective-C兼容的(标记为@objc的类,属性也标记@objc),可以直接使用#keyPath指令获取属性名称:
@objc class Bar: NSObject { @objc let number: Int = 0 } let keyPathStr = #keyPath(Bar.number) print(keyPathStr) // 输出 "number"
但这种方式仅适用于Objective-C兼容的类型,纯Swift结构体无法使用。
内容的提问来源于stack exchange,提问作者sak
相关产品推荐
相关产品推荐

