【问题标题】:Is it possible to get the KVC-String from Swift 4 KeyPath?是否可以从 Swift 4 KeyPath 获取 KVC-String?
【发布时间】:2017-09-10 17:02:05
【问题描述】:

对于我目前正在进行的项目,从我的方法正在接收的 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。 或者他们是否有可能在那里使用反射?提前感谢您的想法/解决方案!

【问题讨论】:

  • _kvcKeyPathString 将有一个值,如果你用@objc 标记属性,因为它的存在是为了支持互操作性。
  • 有道理,谢谢!但这不是我的选择:/似乎我不是唯一一个有用例的人:bugs.swift.org/browse/SR-5821
  • 关于 KeyPath 功能的 Swift 提案提到了将来通过字符串在运行时构建 KeyPath 的能力,所以也许到时候我们就能得到字符串值,或者当他们决定给我们一些可观的反射能力。
  • 我希望我们能获得更多的反射特性,而不仅仅是在 keypaths 方面。再次感谢您的回答,即使它不能解决我的问题,@objc 属性也是正确的。您能否创建一个我可以接受的官方答案?以后再找其他人会更好。
  • 我担心你是对的。很遗憾,因为确实有合法的时间你得到的是一个字符串并且你想将它映射到一个属性。我想放弃 Cocoa KVC,但它做到了,而 Swift KeyPath 没有。

标签: swift


【解决方案1】:

我还不知道将属性名称作为字符串获取的纯 Swift 方法。

但是,如果您将@objc 属性添加到属性,那么_kvcKeyPathString 实际上将有一个值,而不是始终为零。此外,由于 Swift 结构无法在 Objective-C 中表示,因此该方法仅适用于类。

一个最小的工作示例用法:

class SomeClass {
    @objc var someProperty = 5
}

let keyPath = \SomeClass.someProperty
print(keyPath._kvcKeyPathString)

【讨论】:

  • 你知道使用这个属性算不算使用私有API?只是想知道在已发布的 iOS 应用程序中使用它是否是一个非常糟糕的主意(当然除了可维护性问题)
  • @AndrewBennet 这不是一个私有 API,它只是在 Apple 官方文档中没有记录,因此如有更改,恕不另行通知。他们使用前导下划线表明他们并不真正希望人们使用它,但他们可以通过我想象的更多努力将其标记为私有。 source
  • 谢谢!我可以使用它,并编写一个单元测试来保护我免受行为变化的影响?
  • @Allen Humphreys 你能写一个示例代码吗?我试过但无法使用 Swift 4.1
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-11-06
  • 1970-01-01
  • 2014-04-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多