取消#可用语句

如果只想在运行iOS8以前的操作系统的设备上执行代码块。 我做不到:

 if #available(iOS 8.0, *) == false { doFoo() } 

我现在使用的解决scheme是:

 if #available(iOS 8.0, *) { } else { doFoo() } 

,但感觉笨重。 有没有另外一种方法来#available使用swift2来否定#available语句?

我为这个使用了一个guard

 guard #available(iOS 8.0, *) else { // Code for earlier OS } 

当然,由于要求guard退出这个范围,所以有一点尴尬的可能性。 但是,通过将整个事物置于自己的function或方法中,这很容易避开:

 func makeABox() { let boxSize = .large self.fixupOnPreOS8() self.drawBox(sized: boxSize) } func fixupOnPreOS8() { guard #available(iOS 8, *) else { // Fix up return } } 

当你放弃对早期系统的支持时,这真的很容易删除。

看来这是最好的解决scheme,在Swift2之前,你必须使用其他方法,比如使用个人写的随时可用的类。 但没关系,你可以在viewDidLoad()设置一个variables,并用它来检测旧设备:

 var isNewerThan8: Bool = false func viewDidLoad(){ if #available(iOS 8.0, *) { isNewerThan8 = true } else { isNewerThan8 = false } } func myFunction(){ if isNewerThan8 { //foo }else{ //boo } } 

#available语句周围不可能有逻辑。

事实上,编译器使用这个语句来推断在它所包含的范围内可以调用哪些方法,因此在运行时不会有条件地执行该块。

尽pipe如此,可以使用逗号来组合条件

 if #available(iOS 8.0, *), myNumber == 2 { // some code }