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

12
在Objective-C中,所有的对象都可以被视为类型id,并且几乎所有的对象都继承自NSObject。(Block除外)因此,可以创建一个Objective-C类别来扩展所有Objective-C对象。(忽略块)
在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平台)


因此,我的陈述是“几乎所有对象都继承自NSObject”。我忘记了NSDistantObject,但是我举了块的例子,它们是对象但不是NSObject - Duncan C
我不认为Swift有任何关于“扩展方法”(.NET)或“隐式转换”(Scala)的概念,对吗? - user2864740
我不熟悉C#/.NET。你能解释一下扩展方法是什么吗? - Duncan C
有效地在编译时分解静态包装器,以“伪造”特定编译时类型的表达式上的方法。也就是说,原始类型/类/对象本身没有被修改,但可以像添加了额外方法一样使用它。我不知道Swift是否提供类似的功能。 - user2864740
这与Swift扩展或Objective-C类别(本主题的话题)有何不同?听起来像是一回事。 - Duncan C
我不确定它是否适用于Swift/Obj-C,但是通过特定的重载,似乎可以在个别基础/范围上“装饰”类型。 - user2864740
1个回答

8

不是。你已经基本回答了自己的问题——Swift对象没有基类,唯一真正的解决方法就是继承NSObject


无论如何,您不会涉及结构体和枚举;在Swift中定义的大多数不需要继承的对象类型应该是结构体。 - matt
@matt,没错。如果它作为Any协议的扩展,将会更有用,但是Any本身也是一个协议。 - Duncan C
6
这似乎是 Swift 的一个限制,苹果应该解决这个问题。在 Objective-C 中,NSObject 的扩展非常有用。看起来需要一种语言级别的方法来向 AnyObject(甚至 Any)添加扩展。 - Duncan C

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接