2017-09-10 68 views
4

对于我目前正在处理的项目,从我的方法正在接收的KeyPath实例中获取KVC字符串将非常有用。简单的例子:是否有可能从Swift 4 KeyPath获取KVC-String?

struct Person { 
    var name: String 
} 

let propertyCache = ["name": "something"] 

func method<T>(_ keypath: KeyPath<Person, T>) -> T? { 
    let kvcName = keypath.kvc 
    return propertyCache[kvcName] 
} 

这似乎不是很有用,但在我的项目是:)我发现的keyPath的属性称为_kvcKeyPathString这也是公开的,但每次我试图每次返回nil。 或者他们可能有使用反射的可能性吗?提前感谢您的想法/解决方案!

+0

如果您用'@ objc'标记属性,'_kvcKeyPathString'将会有一个值,因为它存在支持互操作性。 –

+0

这很有道理,谢谢!但在我的情况下,这不是一个选项:/看起来我不是唯一一个用例:https://bugs.swift.org/browse/SR-5821 – Ben

+0

Swift KeyPath功能提议提到了能够在未来通过字符串在运行时建立KeyPath,所以当时我们可以获得字符串值,或者当他们决定给我们一些可观的反射能力时。 –

回答

4

我不知道一个纯粹的Swift方式来获取属性的名称作为字符串呢。

但是,如果将@objc属性添加到属性,则_kvcKeyPathString实际上将具有一个值,而不是始终为零。

+0

你知道如果使用这个属性计数作为使用私人API吗?只是想知道在已发布的iOS应用程序中使用它是否是一个非常糟糕的主意(当然除了可维护性问题) –

+0

@AndrewBennet它不是一个私有API,它只是在官方Apple文档中没有记录,因此它受制于没有任何通知改变。他们使用领先的下划线表明他们并不真正希望人们使用它,但他们可以用我想象的更多努力将其标记为私人。 [源代码](https://github.com/apple/swift/blob/a49f175b0785477bff3abf47aff110e37d52f19f/stdlib/public/core/KeyPath.swift#L108) –

+0

谢谢!我可以使用它,并写一个单元测试来保护我免受行为改变 –

相关问题