【问题标题】:Key Value Coding Use in SwiftSwift 中的键值编码使用
【发布时间】:2018-11-21 07:28:30
【问题描述】:

我想知道 KVO 在 swift 中的使用,正如我在 Apple Doc 或任何其他在线文章中所读到的那样,它声明它提供对属性的间接访问并可以通过字符串寻址。我有一些疑问。

  • 如果我可以直接通过 person.name = "John" 设置属性,他们为什么要使用 Set Value for key name =间接“约翰”
  • Apple 文档说,符合键值编码的键值编码可以参与广泛的 Cocoa 技术,例如 Core Data。为什么使用它而不是在其他框架中
  • 在运行时或动态设置值时使用。怎么样?
  • 它是 TypeSafe 吗?如何实现?
  • 它是一个 Objective - C 特性,那么为什么仍然在 Swift 4 中使用,并通过 ./Type.property 访问和设置进行了最新改进

【问题讨论】:

  • KVO 是 Key Value Observing。

标签: swift key-value-observing key-value-coding


【解决方案1】:

如果我可以直接通过 person.name = "John" 设置属性,他们为什么 间接使用键名 = "John" 的设置值

请阅读“What is the point of key-value coding?”


苹果文档说 符合key-value coding 可参与范围广泛的Cocoa 核心数据等技术。为什么在其他框架中使用而不是在其他框架中使用它

在适当的地方使用它。它用于有用且性能可以接受的地方。如果没用,或者性能太低,就不用了。


在运行时或动态设置值时使用。怎么样?

Key-Value Coding 使用 Objective-C 运行时查找 getter 和 setter 方法,并在 setter 不存在时查找实例变量的类型和位置。详细分析请见Friday Q&A 2013-02-08: Let's Build Key-Value Coding

Apple 文档简要描述了 Key-Value Observing here 的实现。它足够短,可以完整引用:

自动键值观察是使用一种称为 isa-swizzling.

isa 指针,顾名思义,指向对象的类 它维护一个调度表。这个调度表本质上是 包含指向类实现的方法的指针,等等 数据。

当一个观察者注册一个对象的属性时,is 被观察对象的指针被修改,指向一个 中间阶级而不是真正的阶级。结果是 isa 指针的值不一定反映实际的类 实例。

你不应该依赖isa 指针来确定类 会员资格。相反,您应该使用class 方法来确定 对象实例的类。

Mike Ash 在Friday Q&A 2009-01-23 中给出了更详细的分析。


是吗 TypeSafe 以及如何实现?

这不是特别安全的类型。例如,它不会阻止您将 UIView 存储在声明为 NSString 的属性中,反之亦然。

它是一个 Objective - C 特性,那么为什么仍然使用 Swift 4 具有 ./Type.property 访问和设置的最新改进

它仍然被使用是因为 Apple 的大部分 SDK 仍然在 Objective-C 中实现,并且因为它可以让你做一些在没有更多“样板”(手动、重复功能)的情况下无法在 Swift 中做的事情。代价是 Objective-C 的性能较低。在很多很多情况下,Objective-C 的较低性能(与 Swift 相比)并不是什么大问题,而增加的活力是非常有帮助的。

【讨论】:

  • 只是一个补充:如果没有 KVC,我的库 EVReflection 将是不可能的(或者您需要像 Codable 协议那样生成代码)有关更多信息,请参阅github.com/evermeer/EVReflection
猜你喜欢
  • 2018-05-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-09-10
  • 2019-06-23
  • 1970-01-01
  • 2017-12-15
  • 1970-01-01
相关资源
最近更新 更多