Swift中键值编码的使用

时间:2018-11-21 07:28:31

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

我想快速了解KVO的用法,正如我在Apple Doc或任何其他在线文章中所读到的那样,它指出它提供了对属性的间接访问并且可以通过字符串寻址。我有一些疑问。

  • 如果我可以直接通过 person.name =“ John” 设置属性,他们为什么要使用设置值 作为键 name =间接“约翰”
  • Apple医生说,符合键值编码的标准可以参与诸如 Core Data 之类的各种Cocoa技术。为什么在其他框架中使用它而不在其他框架中使用
  • 在运行时或动态使用它来设置值。怎么样?
  • 是TypeSafe吗?
  • 这是一个Objective-C功能,为什么还要在Swift 4中使用具有 ./ Type.property 访问和设置功能的最新改进

1 个答案:

答案 0 :(得分:2)

  

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

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


  

苹果医生说   符合键值编码的标准可以参与各种各样的可可   核心数据等技术。为什么在其他框架中而不是在使用它

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


  

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

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

Apple文档简要描述了键值观察here的实现。足够简短地完整引用:

  

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

     

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

     

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

     

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

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


  

是吗   TypeSafe以及如何?

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

  

它是一个目标-C功能,然后为何仍在   Swift 4具有./Type.property访问和设置的最新改进

之所以一直使用它,是因为Apple的大多数SDK仍在Objective-C中实现,并且因为它可以让您完成在Swift中没有更多“样板”(手动,重复性功能)无法完成的工作。需要权衡的是,Objective-C的性能较低。在很多情况下,与Swift相比,Objective-C的性能降低并不是一个重大问题,而动态性的提高非常有帮助。