【问题标题】:Overriding NS*** methods in Swift在 Swift 中重写 NS*** 方法
【发布时间】:2015-11-13 15:43:33
【问题描述】:

为了为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

【问题讨论】:

    标签: objective-c swift


    【解决方案1】:

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

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

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

    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,那么您就不走运了。

    【讨论】:

    • 非常感谢这个关于如何扩展 AnyObject 的答案:stackoverflow.com/a/31988258/8047
    • 或者你可以只扩展 UIViewController、UIView 和可能在几乎所有情况下都调用 NSLocalizedString 的其他一些类。
    • 所以把这个范围缩小到几个不相关的超类,这些超类碰巧都共享 nsobject 作为它们的超类?
    • 哦,对不起,你是对的。我专注于 AnyObject 扩展讨论,忘记了几乎所有从 API 继承的东西也继承自 NSObject。
    • 这曾经可以工作,但突然间我得到:“在类型 'NSObject' 上使用实例成员 'NSLocalizedString';你的意思是使用类型为 'NSObject' 的值吗?”和“调用中的额外参数'评论'”
    【解决方案2】:

    您将不得不执行一个全局函数...其他选项将导致各种问题,例如重新训练周期,或者不从 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)
    }
    

    【讨论】:

      猜你喜欢
      • 2016-01-15
      • 2014-08-09
      • 2023-02-06
      • 2016-03-10
      • 1970-01-01
      • 2014-09-27
      • 1970-01-01
      • 1970-01-01
      • 2015-08-21
      相关资源
      最近更新 更多