【问题标题】:In Swift, is Key-Value Coding available for custom objects without subclassing NSObject?在 Swift 中,没有子类化 NSObject 的自定义对象是否可以使用键值编码?
【发布时间】:2017-05-30 18:02:19
【问题描述】:

Key-Value Coding Programming Guide 中声明 NSObject 子类符合 KVC。

默认情况下,从 NSObject 或其子类之一继承的 Swift 对象的属性符合键值编码

自定义对象(结构、类)可以采用NSKeyValueCoding 并符合 KVC 吗? 另外,KVC 是如何通过继承 NSObject 来赋予对象的?

【问题讨论】:

  • 我很尴尬。我删除了我的“KVO”答案——请忽略! ;-)
  • 没问题,这两者太混乱了,因为缩写太相似了! @joeybladb

标签: ios swift cocoa key-value-coding


【解决方案1】:

与任何对象在技术上都可以符合的正式协议不同,NSKeyValueCoding 可通过Informal Protocols: 提供给任何NSObject

非正式协议是 NSObject 上的一个类别,它隐含地使 几乎所有对象都采用该协议。 (类别是一种语言 使您能够在不进行子类化的情况下向类添加方法的功能 它。)在非正式协议中的方法的实现是 选修的。在调用方法之前,调用对象会检查以查看 目标对象是否实现它。直到任择议定书 方法是在 Objective-C 2.0 中引入的,非正式协议是 对 Foundation 和 AppKit 类的实现方式至关重要 委托。

这与简单地将 KVC 直接实现到 NSObject 不同,我认为非正式协议的主要好处是将 NSObject 的功能拆分为单独的文件。但是使用非正式协议可能还有其他好处

而且因为NSKeyValueCodingNSObject 上的一个类别,很遗憾,您不能只让任何自定义对象支持KVC

【讨论】:

  • 可以制作一个自定义的非NSObject 继承类(在 Apple 平台上)支持 KVC - 您只需要实现(并向 Obj-C 公开)这些方法由非正式的NSKeyValueCoding 协议详细说明。不过,除了学习练习之外,我并不建议这样做。
  • @Hamish 你能发一个这样的例子吗?如果可能,那将是正确的答案。我在问它在没有 NSObject 子类的 Swift 中的可能性以及它如何“只是”在 NSObject 上工作。
  • 有趣的一点,你会怎么做呢?我没想到你可以?因为NSKeyValueCoding 实际上是一个类别(在这种情况下也称为非正式协议),所以它的实现已经完成。除了覆盖 -setValue:forKey: 和其他任何东西之外,我认为您不能让任何自定义对象符合要求吗?
  • 这是一个(非常)粗略的示例,说明如何做到这一点(它没有考虑属性设置和其他一些事情):gist.github.com/hamishknight/3e804b9ba9e722c84551f3fef0183d0f
  • @AO 所以 KVC “只是”在 NSObjects 上工作,因为非正式协议已经实现?
猜你喜欢
  • 2012-12-20
  • 2018-06-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-10-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多