swift 否定#available语句

sf6xfgos  于 2023-05-27  发布在  Swift
关注(0)|答案(5)|浏览(187)

我希望仅在运行的操作系统早于iOS8的设备上执行代码块。我做不到:

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

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

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

,但感觉很笨重。有没有其他方法可以用Swift优雅地否定#available语句?

bbmckpt7

bbmckpt71#

我使用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
    }
}

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

093gszye

093gszye2#

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

if #unavailable(iOS 15) {
    // Under iOS 15
} else {
    // iOS 15+
}

或者根据您的情况仅提供以下内容:

if #unavailable(iOS 15) {
    // Under iOS 15
}

这是SE-0290: Negative availability的一部分。

bvjxkvbb

bvjxkvbb3#

#available语句周围不可能有逻辑。
事实上,编译器使用该语句来推断在它包含的范围内可以调用哪些方法,因此在运行时不能做任何有条件地执行该块的事情。
但是可以使用逗号合并条件,如下所示

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

vdgimpew4#

看起来这是最好的解决方案,在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
   }
}
wgx48brx

wgx48brx5#

Swift 5.6

if #unavailable(iOS 13, *) {
   // below iOS 13
} else {
  // iOS 13 and above
}

Swift 5.5及更早版本

一种简单的检查方法是使用#availableguard语句

guard #available(iOS 13, *) else {
   // code for earlier versions than iOS 13
   return
}

另一种方法是使用if/else

if #available(iOS 13, *) {} else {
    // code for earlier versions than iOS 13
}

相关问题