覆盖Swift中的NS ***方法

时间:2015-11-13 15:43:33

标签: objective-c swift

要为NSLocalizedString提供后备语言,我在Objective-C中使用此#undef#define

#undef NSLocalizedString
#define NSLocalizedString(key, comment) @"NSLocalizedString has been replaced";

如果从Objective-C调用,这非常有效,但如果从Swift调用,则忽略NSLocalizedString的新定义。 (桥接头已正确配置并正常工作)

这在Swift中是否可行,若然,怎么办?

注意:真实的例子是here on Github,另见SO answer here

2 个答案:

答案 0 :(得分:3)

您可以为此{/ 1>这样的NSObject子类执行此操作

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

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"
    }
}

备注

  • 这两个解决方案都可以在您的项目中没有任何问题。
  • 如果您在课程实例之外调用NSLocalizedString,那么您将无法运气。

答案 1 :(得分:0)

您将必须执行全局功能...其他选项将导致各种各样的问题,例如重新训练周期,或者女巫的类类不从NSObject继承(这只是问题的子集)-这将根本不起作用。是的,全局函数通常很大!但这是“覆盖”全局功能的唯一方法。 , 这是我在生产中使用的代码,我们有数千个字符串,在某些时候,我们必须使我们的应用程序动态本地化-这就是我们所做的。

// Global functions for lagacy code
func NSLocalizedString(_ key: String, comment: String) -> String {
    return key.localized()
}

func NSLocalizedStringInTable(key: String, tableName: String ) -> String {
    return key.localized(using: tableName)
}