您可以使用可用性检查在swift中创建polyfill吗?

时间:2015-07-27 12:02:16

标签: swift

Swift 2允许您检查当前平台和版本以确保更新的方法/属性可用,并且如果不是,则允许您编写回退代码,方法是使用#available写入条件块。

例如,在OSX10.10中,NSTextField有一个名为placeholderString的属性,但在旧版本中,您必须通过中间NSTextFieldCell对象访问此信息。您可以安全地使用新系统,对旧旧系统进行回退,如下所示:

var placeholder : String
if #available(OSX 10.10, *) {
    placeholder = inputBox.placeholderString!
} else {
    placeholder = (inputBox.cell as! NSTextFieldCell).placeholderString!
}

Swift还允许您使用extension

扩展现有类

例如,将占位符属性添加到NSTextField

extension NSTextField {
    var placeholderString: String? {
        return (self.cell as! NSTextFieldCell).placeholderString
    }
}

那么......是否有可能将这两个想法结合起来并创建类似polyfill的东西,我们在当前平台上有条件地扩展一个类,以便回溯地将新API的功能添加到旧平台?

所以在我的例子中,我想写这样的东西:

if !#available(OSX 10.10, *) {
    extension NSTextField {
        var placeholderString: String? {
            return (self.cell as! NSTextFieldCell).placeholderString
        }
    }
}

上面没有编译。但它说明了我正在寻找的那种东西。如果当前平台上有特定的东西,那么使用它,否则为它提供实现。

Swift有没有办法实现这个目标?

随后,您可以安全地使用textField.placeholderString,而无需担心平台版本。

1 个答案:

答案 0 :(得分:1)

if #available()检查运行时,而不是在编译或链接时。 因此,我认为唯一可行的方法是定义一个包装器 方法:

extension NSTextField {
    var myPlaceholderString: String? {
        if #available(OSX 10.10, *) {
            return self.placeholderString
        } else {
            return (self.cell as! NSTextFieldCell).placeholderString
        }
    }
}

(我知道这并不是你想要的。) 也许其他人有更好的解决方案!