在Objective-C中,所有对象都可以被视为类型id,几乎所有对象都从NSObject继承。 (块没有,但这是唯一的例外。)
因此,可以创建一个扩展所有Objective-C对象的Objective-C类别。 (忽略块)
在Objective-C中,我创建了一个NSObject的扩展,它使用关联的对象来选择将字典附加到任何NSObject。这使我能够实现方法setAssocValue:forKey:
和assocValueForKey:
,这使得可以将键/值对附加到任何NSObject。这在很多情况下都很有用。
例如,它可以将存储的属性添加到类别中。你只需编写一个getter / setter,它使用相关的值方法来附加一个存储的对象,然后离开。
它还可以在运行时将值附加到现有系统对象。您可以在按钮上挂起数据或代码块,或者做您需要做的任何事情。
我想在Swift中做同样的事情。
但是,Swift没有像Objective-C那样的所有对象的公共基类。 AnyObject
和Any
是protcols。
因此,
extension AnyObject
不会编译。
我不知道在Swift中“附加”我的setAssocValue:forKey:
和assocValueForKey:
方法的位置。
我可以为我的扩展创建一个基类,但是这使得使用扩展失败了。我可以使我的基础对象成为Objective-C NSObject,但这意味着我的所有对象必须是NSObjects,默认情况下Swift对象不是NSObject。
(顺便说一下,这个问题适用于Mac OS和iOS平台)
答案 0 :(得分:4)
没有。你几乎已经回答了自己的问题--Swift对象没有基类,解决它的唯一真正方法是从NSObject
继承。