扩展属性(如果不可用)

时间:2015-11-03 17:23:10

标签: ios swift runtime availability

使用Swift 2,Apple引入了API可用性检查,允许用户仅在指定版本或更高版本上执行某些代码,如下所示:

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

例如,iOS 9.0引入了localizedUppercaseString属性:

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

我想要的是创建此属性的精确副本,该副本仅适用于低于9.0的版本,因此每当我需要使用此(或任何其他)属性/方法时,我都不必检查if #available(iOS 9, *)

我能得到的最好结果如下:

extension String {

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

        return uppercaseStringWithLocale(NSLocale.currentLocale())
    }
}

有了这个,我可以拨打localizedUppercaseString,无论iOS版本是8.0还是9.0。问题是这个扩展优先于"原始"使用iOS 9.0执行时的属性。

1 个答案:

答案 0 :(得分:2)

extension String {

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

现在您只需使用myLocalizedUppercaseString属性。