在 Swift 中覆盖 NS*** 方法

Dan*_*ark 5 objective-c swift

为了提供一个备用的语言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 答案

Dan*_*ark 3

您可以对NSObject这样的子类执行此操作

extension NSObject {
    func NSLocalizedString(key: String, comment: String) -> String {
        return "yes we have localized an NSObject"
    }
}
Run Code Online (Sandbox Code Playgroud)

关于什么AnyObject?在这种情况下,您必须了解并遵守子类FallbackLanguage中的协议AnyObject

protocol FallbackLanguage: class {}

// add default implementations
extension FallbackLanguage {
    func NSLocalizedString(key: String, comment: String) -> String {
        return "yes we have localized AnyObject via FallbackLanguage protocol"
    }
}
Run Code Online (Sandbox Code Playgroud)

笔记

  • 这两种解决方案都可以在您的项目中使用,不会出现任何问题。
  • NSLocalizedString如果您在类实例之外调用,那么您就不走运了。