否定#available语句

时间:2015-09-17 15:06:22

标签: ios swift

我只想在运行OS早于iOS8的设备上执行代码块。我不能这样做:

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

我现在使用的解决方案是:

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

,但感觉很笨重。还有另一种方法可以优雅地用Swift来否定#available语句吗?

5 个答案:

答案 0 :(得分:12)

我使用guard

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

由于退出范围需要guard,因此尴尬的可能性很小。但是,通过将整个事物放入其自己的功能或方法中,很容易回避:

func makeABox()
{
    let boxSize = .large

    self.fixupOnPreOS8()

    self.drawBox(sized: boxSize)
}

func fixupOnPreOS8()
{
    guard #available(iOS 8, *) else {
        // Fix up
        return
    }
}

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

答案 1 :(得分:6)

#available语句不可能有逻辑。

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

虽然可以使用逗号组合条件,如下所示

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

答案 2 :(得分:1)

似乎它是最好的解决方案,在Swift2之前你必须使用其他方法,例如使用个人编写的即用型课程。但是没关系,您可以在viewDidLoad()中设置变量并使用它来检测旧设备:

var isNewerThan8: Bool = false

func viewDidLoad(){
   if #available(iOS 8.0, *) { 
      isNewerThan8 = true
   } else { 
      isNewerThan8 = false
   }
}

func myFunction(){
   if isNewerThan8 {
     //foo
   }else{
    //boo
   }
}

答案 3 :(得分:0)

简单的检查方法是创建函数

func isNewFeatureAvailable() -> Bool {
    if #available(iOS 9, *) {
        return true
    } else {
        return false
    }
}

使用:

if isNewFeatureAvailable() {
    // use new api
} else {
    // use old api
}

或者仅使用内联

    if #available(iOS 9, *) {
        // use new api
    } else {
        // use old api
    }

答案 4 :(得分:0)

简单的检查方法是创建函数

func isNewFeatureAvailable() -> Bool {
    if #available(iOS 9, *) {
        return true
    } else {
        return false
    }
}

使用:

if isNewFeatureAvailable() {
    // use new api
} else {
    // use old api
}

或者仅使用内联

if #available(iOS 9, *) {
   // use new api
} else {
   // use old api
}