否定#available语句

tom*_*ahh 27 ios swift

我想只在运行早于OS的设备上执行代码块iOS8.我做不到:

if #available(iOS 8.0, *) == false {
    doFoo() 
}
Run Code Online (Sandbox Code Playgroud)

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

if #available(iOS 8.0, *) { } else { 
    doFoo() 
}
Run Code Online (Sandbox Code Playgroud)

,但感觉笨重.还有另一种方法可以#available优雅地否定Swift 的声明吗?

Geo*_*e_E 25

在 Swift 5.6 中,您现在可以执行以下操作:

if #unavailable(iOS 15) {
    // Under iOS 15
} else {
    // iOS 15+
}
Run Code Online (Sandbox Code Playgroud)

或者根据您的情况仅执行以下操作:

if #unavailable(iOS 15) {
    // Under iOS 15
}
Run Code Online (Sandbox Code Playgroud)

这是SE-0290:负面可用性的一部分。


Jos*_*ell 18

我用guard这个:

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

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

func makeABox()
{
    let boxSize = .large

    self.fixupOnPreOS8()

    self.drawBox(sized: boxSize)
}

func fixupOnPreOS8()
{
    guard #available(iOS 8, *) else {
        // Fix up
        return
    }
}
Run Code Online (Sandbox Code Playgroud)

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

  • 不确定我是否同意。 (2认同)

tom*_*ahh 6

围绕#available声明不可能有逻辑.

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

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

if #available(iOS 8.0, *), myNumber == 2 {
  // some code
}
Run Code Online (Sandbox Code Playgroud)