在Swift中为所有对象添加扩展/方法

时间:2015-05-11 19:24:54

标签: swift oop methods

在Objective-C中,所有对象都可以被视为类型id,几乎所有对象都从NSObject继承。 (块没有,但这是唯一的例外。)

因此,可以创建一个扩展所有Objective-C对象的Objective-C类别。 (忽略块)

在Objective-C中,我创建了一个NSObject的扩展,它使用关联的对象来选择将字典附加到任何NSObject。这使我能够实现方法setAssocValue:forKey:assocValueForKey:,这使得可以将键/值对附加到任何NSObject。这在很多情况下都很有用。

例如,它可以将存储的属性添加到类别中。你只需编写一个getter / setter,它使用相关的值方法来附加一个存储的对象,然后离开。

它还可以在运行时将值附加到现有系统对象。您可以在按钮上挂起数据或代码块,或者做您需要做的任何事情。

我想在Swift中做同样的事情。

但是,Swift没有像Objective-C那样的所有对象的公共基类。 AnyObjectAny是protcols。

因此,

extension AnyObject

不会编译。

我不知道在Swift中“附加”我的setAssocValue:forKey:assocValueForKey:方法的位置。

我可以为我的扩展创建一个基类,但是这使得使用扩展失败了。我可以使我的基础对象成为Objective-C NSObject,但这意味着我的所有对象必须是NSObjects,默认情况下Swift对象不是NSObject。

(顺便说一下,这个问题适用于Mac OS和iOS平台)

1 个答案:

答案 0 :(得分:4)

没有。你几乎已经回答了自己的问题--Swift对象没有基类,解决它的唯一真正方法是从NSObject继承。