【发布时间】:2015-08-12 19:56:42
【问题描述】:
在 Objective-C 中,我创建了一个非常方便的 NSObject 类别(用 Swift 术语来说是扩展),它增加了在运行时将任意键/值对添加到任何 NSObject 的能力。它使用关联对象将可变字典附加到对象,然后提供 get 和 set 方法来获取/设置键/值对到/从该字典。只需要几行代码。
这使得在运行时将任意键/值对附加到任何对象(包括系统创建的对象)成为可能。那是关键。在某些情况下,系统框架会向您返回一个对象,而您需要能够为其附加一个值。
这个技巧还可以创建具有新实例变量的类别。 (好吧,它们不是真的,但它确实允许您向类别中的对象添加新的状态变量。)
这在 Swift 1.2 中是不可能的,因为:
- Swift 没有像 NSObject 这样的所有对象的基类 目标-C。它使用 AnyObject,这是一个协议。
- 斯威夫特 1.2 不允许扩展协议。
在 Swift 1.2 下我不得不放弃这个。
但是 Swift 2 允许扩展协议。我想“太好了,现在我可以添加我的扩展,让我可以将键/值对添加到 AnyObject!”
不开心。
当我尝试为 AnyObject 创建扩展时:
extension AnyObject: AssociatedObjectProtocol
我收到错误消息
'AnyObject' 协议无法扩展
啊!如此接近,但没有。似乎该语言明确禁止扩展 AnyObject。为什么会这样,有什么办法可以解决吗?
我不经常在 NSObject 上使用我的类别,但当我这样做时,它就是救命稻草。我想将它添加到我的 Swift 技巧包中。
我可以像在 Objective-C 中那样将它添加到 NSObject 中,但这意味着它只适用于从 NSObject 继承的对象 - 使其不适用于原生 Swift 类。
【问题讨论】:
-
随机注释:我认为您不希望您的协议以小写字母开头。 developer.apple.com/library/mac/documentation/Cocoa/Conceptual/…