在Objective-C中,所有的对象都可以被视为类型id,并且几乎所有的对象都继承自NSObject。(Block除外)因此,可以创建一个Objective-C类别来扩展所有Objective-C对象。(忽略块)
在Objective-C中,我创建了一个NSObject的扩展,使用关联对象可选地向任何NSObject附加字典。这使我能够实现方法
它使得在类别中添加存储属性成为可能,例如,你只需编写使用关联值方法的getter / setter来附加存储对象,然后就可以去做其他事情了。
它还使得在运行时将值附加到现有系统对象变得可能。您可以将数据或代码块挂在按钮上,或者执行任何需要执行的操作。
我想在Swift中做同样的事情。
然而,Swift没有像Objective-C一样的所有对象的公共基类。AnyObject和Any是协议。
因此,
在Objective-C中,我创建了一个NSObject的扩展,使用关联对象可选地向任何NSObject附加字典。这使我能够实现方法
setAssocValue:forKey:
和assocValueForKey:
,从而可以将键/值对附加到任何NSObject上。这在许多情况下非常有用。它使得在类别中添加存储属性成为可能,例如,你只需编写使用关联值方法的getter / setter来附加存储对象,然后就可以去做其他事情了。
它还使得在运行时将值附加到现有系统对象变得可能。您可以将数据或代码块挂在按钮上,或者执行任何需要执行的操作。
我想在Swift中做同样的事情。
然而,Swift没有像Objective-C一样的所有对象的公共基类。AnyObject和Any是协议。
因此,
extension AnyObject
无法编译。
我不知道在Swift中应该在哪里“附加”我的setAssocValue:forKey:
和assocValueForKey:
方法。
我可以为我的扩展创建一个基类,但这样做会使使用扩展的意义丧失。我可以将我的基本对象作为Objective-C NSObject,但这意味着所有的对象都必须是NSObjects,而Swift对象默认情况下不是NSObjects。
(顺便说一句,这个问题适用于Mac OS和iOS平台)
NSDistantObject
,但是我举了块的例子,它们是对象但不是NSObject
。 - Duncan C