Swift 4静态获取模型属性名称的值

Swift 4静态获取模型属性名称的值,swift,swift4,Swift,Swift4,使用Swift 3时,我是这样定义我的模型的 class Model: NSObject { var prop1: String } 当我想访问属性名prop1的静态字符串值时,我会使用let sad=#keyPath(Model.prop1)并打印出“prop1”。快乐的日子 问题是,自从升级到Swift 4后,我在执行上述操作时遇到了困难。我在其他帖子中看到,我们可以使用新的\Model.prop1语法,但它似乎提供了属性值,而不是名称的字符串表示 我也在重构我的Swift模型对

使用Swift 3时,我是这样定义我的模型的

class Model: NSObject {
    var prop1: String
} 
当我想访问属性名prop1的静态字符串值时,我会使用
let sad=#keyPath(Model.prop1)
并打印出“prop1”。快乐的日子

问题是,自从升级到Swift 4后,我在执行上述操作时遇到了困难。我在其他帖子中看到,我们可以使用新的
\Model.prop1
语法,但它似乎提供了属性值,而不是名称的字符串表示

我也在重构我的Swift模型对NSObject的需求,但我认为我仍然可以获得这个功能


任何帮助都将不胜感激

Swift属性在运行时不一定保留属性名称的字符串。因此,如果Swift键路径语法能够为您提供此字符串值,那么它只能用于
NSObject
派生的类。然而,Swift密钥路径语法不仅适用于这些密钥路径;它还可用于引用非@objc类和结构的属性。因此,这是不可能的。但是,
#keyPath
语法仍然可用,以获取Objective-C属性的字符串键路径。

这里的意思是“它不能用于引用…”吗?好吧,这是我的一厢情愿。谢谢你的解释,查尔斯!我还看到一条警告消息:“#keyPath”的参数指的是依赖于Swift 4中弃用的“@objc”推断的“Model”中的属性“method”,这就是你说语法仍然可用时的意思吗?@RobNapier Nope!您完全可以使用Swift 4键路径引用任何对象、类或结构的任何属性。@HarryBloom在Swift 3中,与Objective-C兼容的
NSObject
上的任何方法或属性都将自动推断为
@objc
。在Swift 4中不再如此,只有在方法上加上
@objc
关键字,方法才会暴露于Objective-C。因此,如果您使用需要Objective-C支持的功能,例如
#selector
#keyPath
,则您传递的方法需要在其声明中包含
@objc