Search code examples
iosswiftruntimeavailability

Extended property if not available


With Swift 2, Apple introduced the API availability checking which allows one to execute certain code only on a specified version or later, like this:

if #available(iOS 9, *) {
    // use UIStackView
} else {
    // use fallback
}

For instance, iOS 9.0 introduces the localizedUppercaseString property:

/// An uppercase version of the string that is produced using the current
/// locale.
public var localizedUppercaseString: String { get }

What I want is to create an exact replica of this property that is only available for versions lower than 9.0 so I do not have to check if #available(iOS 9, *) whenever I need to use this (or any other) property/method.

The best result I could get was the following:

extension String {

    @available(iOS 8.0, *)
    var localizedUppercaseString: String {

        return uppercaseStringWithLocale(NSLocale.currentLocale())
    }
}

With this, I can call localizedUppercaseString, no matter if the iOS version is 8.0 or 9.0. The problem is that this extension overrides the "original" property when executed with iOS 9.0.


Solution

  • extension String {
    
        var myLocalizedUppercaseString: String {
            if #available(iOS 9, *) {
                return localizedUppercaseString
            } else {
                return uppercaseStringWithLocale(NSLocale.currentLocale())
            }
        }
    }
    

    Now you just have to use myLocalizedUppercaseString property.