Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 否定可用语句_Ios_Swift - Fatal编程技术网

Ios 否定可用语句

Ios 否定可用语句,ios,swift,Ios,Swift,我只想在运行早于iOS8的操作系统的设备上执行代码块。我做不到: if #available(iOS 8.0, *) == false { doFoo() } 我目前使用的解决方案是: if #available(iOS 8.0, *) { } else { doFoo() } ,但感觉很笨重。是否有其他方法可以用Swift优雅地否定#可用的语句?似乎这是最好的解决方案,在Swift2之前,您必须使用其他方法,例如使用个人编写的现成类。但这很好,您可以在viewDidL

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

if #available(iOS 8.0, *) == false {
    doFoo() 
}
我目前使用的解决方案是:

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

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

似乎这是最好的解决方案,在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
   }
}

语句周围不可能有可用的逻辑

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

但也可以使用逗号组合条件,如下所示

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

我为此使用
防护装置

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
    }
}

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

一种简单的检查方法是使用
#available
保护
语句

guard #available(iOS 9, *) else {
   // code for earlier versions than iOS 9
   return
} 
另一种方法是使用if/else

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

检查操作系统版本很少是个好主意。正确的做法是查看类或方法是否存在。@rmaddy您所说的根本不是真的。WWDC的视频中有一部分引用了这一点。@rmaddy读过这样的内容。@codingart我说的是真的。然而,根据您链接的文章中的“但是您之前告诉过我……”部分,从Swift 2开始,这在Swift中不再适用(但对于Objective-C仍然适用)。很高兴知道。@rmaddy在这里阅读我的回复:。iOS Apple中有一些定义的常量,专门用于通过
NSFoundationNumber
检查版本号。还有
NSProcessInfo().isoperatingsystemmatleastversion
了解更多详细信息。这两种都可以在Objc中使用
NSFoundationNumber
已经存在了相当长的一段时间。如果你问我的话,使用
guard
这样做感觉很快-很好的黑客行为!:-)我不确定我是否同意。。警卫强迫返回,但这并不适用于任何地方