向 Swift 中的所有对象添加 extension/method
Add an extension/method to all objects in Swift
在Objective-C中,所有的对象都可以看作是type id,几乎所有的对象都继承自NSObject。 (块没有,但这是唯一的例外。)
因此可以创建一个扩展所有 Objective-C 对象的 Objective-C 类别。 (忽略块)
在 Objective-C 中,我创建了一个 NSObject 扩展,它使用关联对象来选择性地将字典附加到任何 NSObject。这使我能够实现方法 setAssocValue:forKey:
和 assocValueForKey:
,从而可以将 key/value 对附加到任何 NSObject。这在很多情况下都很有用。
例如,它可以将存储的属性添加到类别中。您只需编写一个 getter/setter,它使用关联的值方法来附加存储的对象,然后就可以了。
它还可以在运行时将值附加到现有系统对象。你可以把数据或代码块挂在按钮上,或者做任何你需要做的事情。
我想在 Swift 中做同样的事情。
然而,Swift 没有像 Objective-C 那样的所有对象的共同基础 class。 AnyObject
和 Any
是协议。
因此,
extension AnyObject
无法编译。
我不知道 "attach" 我的 setAssocValue:forKey:
和 assocValueForKey:
方法在 Swift 中的位置。
我可以为我的扩展创建一个基础 class,但这违背了使用扩展的意义。我可以使我的基础对象成为 Objective-C NSObject,但这意味着我的所有对象都必须是 NSObject,而 Swift 对象默认不是 NSObject。
(顺便说一句,这个问题适用于 Mac OS 和 iOS 平台)
没有。您几乎已经回答了自己的问题——Swift 对象没有基础 class,唯一真正解决这个问题的方法是继承自 NSObject
.
在Objective-C中,所有的对象都可以看作是type id,几乎所有的对象都继承自NSObject。 (块没有,但这是唯一的例外。)
因此可以创建一个扩展所有 Objective-C 对象的 Objective-C 类别。 (忽略块)
在 Objective-C 中,我创建了一个 NSObject 扩展,它使用关联对象来选择性地将字典附加到任何 NSObject。这使我能够实现方法 setAssocValue:forKey:
和 assocValueForKey:
,从而可以将 key/value 对附加到任何 NSObject。这在很多情况下都很有用。
例如,它可以将存储的属性添加到类别中。您只需编写一个 getter/setter,它使用关联的值方法来附加存储的对象,然后就可以了。
它还可以在运行时将值附加到现有系统对象。你可以把数据或代码块挂在按钮上,或者做任何你需要做的事情。
我想在 Swift 中做同样的事情。
然而,Swift 没有像 Objective-C 那样的所有对象的共同基础 class。 AnyObject
和 Any
是协议。
因此,
extension AnyObject
无法编译。
我不知道 "attach" 我的 setAssocValue:forKey:
和 assocValueForKey:
方法在 Swift 中的位置。
我可以为我的扩展创建一个基础 class,但这违背了使用扩展的意义。我可以使我的基础对象成为 Objective-C NSObject,但这意味着我的所有对象都必须是 NSObject,而 Swift 对象默认不是 NSObject。
(顺便说一句,这个问题适用于 Mac OS 和 iOS 平台)
没有。您几乎已经回答了自己的问题——Swift 对象没有基础 class,唯一真正解决这个问题的方法是继承自 NSObject
.