在Objective-C中,我创建了一个非常方便的类别(在Swift中称为扩展),用于NSObject
,它可以在运行时向任何NSObject
添加任意键/值对的功能。 它使用关联对象将可变字典附加到对象上,然后提供获取和设置方法,从该字典中获取/设置键/值对。只需几行代码。
这使得可以在运行时将任意键/值对附加到任何对象上,包括系统创建的对象。这就是关键。有些情况下,系统框架会返回一个对象,您需要能够将值附加到它上面。
这个技巧还可以创建具有新实例变量的类别。(好吧,它们不是真正的实例变量,但它确实让您向类别中的对象添加新状态变量。)
在Swift 1.2中不可能做到这一点,因为:
- Swift没有像Objective-C中的NSObject那样的所有对象的基类。它使用AnyObject,它是一个协议。
- Swift 1.2不允许协议的扩展。
在Swift 1.2下,我不得不放弃这个想法。
但是,Swift 2允许扩展协议。我想:“太好了,现在我可以添加允许我向AnyObject添加键/值对的扩展!”
然而没有成功。
当我尝试为AnyObject创建我的扩展:
extension AnyObject: AssociatedObjectProtocol
我收到了错误信息:
'AnyObject'协议无法被扩展
糟糕!离成功很近,但又失败了。似乎这个语言明确禁止扩展AnyObject。为什么会这样,有没有办法绕过它呢?
我并不经常使用NSObject上的分类,但是当我需要时,它非常有用。我想在Swift中将其加入我的技能包。
我可以像在Objective-C中那样将其添加到NSObject中,但这意味着它只适用于从NSObject继承的对象——对于原生的Swift类不起作用。