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
,而无需担心平台版本。
答案 0 :(得分:1)
if #available()
检查运行时,而不是在编译或链接时。
因此,我认为唯一可行的方法是定义一个包装器
方法:
extension NSTextField {
var myPlaceholderString: String? {
if #available(OSX 10.10, *) {
return self.placeholderString
} else {
return (self.cell as! NSTextFieldCell).placeholderString
}
}
}
(我知道这并不是你想要的。) 也许其他人有更好的解决方案!