Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Overriding NS*** methods in Swift

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

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

This works perfectly well if called from Objective-C, but if called from Swift, the new definition of NSLocalizedString is ignored. (bridging header is configured correctly and works)

Is this possible in Swift, and if so, how?


Note: the real example is here on Github, also see SO answer here

like image 875
Dan Rosenstark Avatar asked Oct 19 '22 22:10

Dan Rosenstark


1 Answers

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.
like image 111
Dan Rosenstark Avatar answered Nov 15 '22 07:11

Dan Rosenstark