首页 > 解决方案 > Swift 中的键值编码使用

问题描述

我想知道如何在 swift 中使用 KVO,因为我在 Apple Doc 或任何其他在线文章中看到它声明它提供对属性的间接访问并通过字符串寻址。我有一系列疑问。

标签: swiftkey-value-observingkey-value-coding

解决方案


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

请阅读“键值编码的意义何在?”</a>


Apple 文档说,符合键值编码的键值编码可以参与广泛的 Cocoa 技术,例如 Core Data。为什么使用它而不是在其他框架中

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


它用于运行时或动态设置值。怎么样?

Key-Value Coding 使用 Objective-C 运行时查找 getter 和 setter 方法,并在 setter 不存在时查找实例变量的类型和位置。请参阅2013-02-08 星期五问答:让我们构建键值对编码进行详细分析。

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

自动键值观察是使用称为 isa-swizzling的技术实现的。

isa顾名思义,指针指向维护调度表的对象类。这个分派表本质上包含指向类实现的方法的指针,以及其他数据。

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

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

Mike Ash 在周五问答 2009-01-23中给出了更详细的分析。


它是 TypeSafe 吗?如何?

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

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

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


推荐阅读