在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
Run Code Online (Sandbox Code Playgroud)
不会编译.
我不知道在Swift中"附加"我setAssocValue:forKey:和assocValueForKey:方法的位置.
我可以为我的扩展创建一个基类,但这违背了使用扩展的要点.我可以使我的基础对象成为Objective-C NSObject,但这意味着我的所有对象必须是NSObjects,默认情况下Swift对象不是NSObjects.
(顺便说一下,这个问题适用于Mac OS和iOS平台)
为了提供一个备用的语言NSLocalizedString,我用这#undef和#define在Objective-C:
#undef NSLocalizedString
#define NSLocalizedString(key, comment) @"NSLocalizedString has been replaced";
Run Code Online (Sandbox Code Playgroud)
如果从 Objective-C 调用,这非常有效,但如果从 Swift 调用,NSLocalizedString则忽略新的定义。(桥接头配置正确且工作正常)
这在 Swift 中是否可行,如果可以,如何实现?
注意:真正的例子在 Github 上,也可以在这里看到SO 答案
如果要向每个对象添加扩展名,则可以执行以下操作:
extension AnyObject
{
func myFunc() { ... }
}
Run Code Online (Sandbox Code Playgroud)
是否有类似的地方可以在每个枚举中添加函数?换句话说,每个枚举的基本“类”是什么?