Overriding NS*** methods in Swift

前端 未结 2 497
眼角桃花
眼角桃花 2020-12-11 21:20

To provide a fallback language for NSLocalizedString, I\'m using this #undef and #define in Objective-C:

#undef NSLoca         


        
相关标签:
2条回答
  • 2020-12-11 21:56

    You can do this for NSObject subclasses like this

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

    What about AnyObject? In this case, you would have to be aware of and conform to the FallbackLanguage protocol in your AnyObject subclass

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

    Notes

    • These two solutions can both be in your project without any issues.
    • If you're calling NSLocalizedString outside of a class instance, you're out of luck.
    0 讨论(0)
  • 2020-12-11 22:02

    You will have to do a global function... the other options will cause all sort of problems, such as retrain cycles, or classes classes witch do not inherit from NSObject(that is only subset of the problems) - this will not work at all. yes global function usually are big no! but that is the only way to "override" global function. , Here is a code I use in production, we had few thousands of string, at some point we had to make our app dynamically localized - and this is what we did.

    // 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)
    }
    
    0 讨论(0)
提交回复
热议问题