我希望仅在运行的操作系统早于iOS8的设备上执行代码块。我做不到:
iOS8
if #available(iOS 8.0, *) == false { doFoo() }
我现在使用的解决方案是:
if #available(iOS 8.0, *) { } else { doFoo() }
,但感觉很笨重。有没有其他方法可以用Swift优雅地否定#available语句?
#available
bbmckpt71#
我使用guard来实现:
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 } }
当你放弃对早期系统的支持时,这真的很容易删除。
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的一部分。
bvjxkvbb3#
在#available语句周围不可能有逻辑。事实上,编译器使用该语句来推断在它包含的范围内可以调用哪些方法,因此在运行时不能做任何有条件地执行该块的事情。但是可以使用逗号合并条件,如下所示
if #available(iOS 8.0, *), myNumber == 2 { // some code }
vdgimpew4#
看起来这是最好的解决方案,在Swift2之前,你必须使用其他方法,比如使用个人编写的现成的类。不过没关系,您可以在viewDidLoad()中设置一个变量,并使用它来检测旧设备:
viewDidLoad()
var isNewerThan8: Bool = false func viewDidLoad(){ if #available(iOS 8.0, *) { isNewerThan8 = true } else { isNewerThan8 = false } } func myFunction(){ if isNewerThan8 { //foo }else{ //boo } }
wgx48brx5#
Swift 5.6
if #unavailable(iOS 13, *) { // below iOS 13 } else { // iOS 13 and above }
Swift 5.5及更早版本
一种简单的检查方法是使用#available和guard语句
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 }
5条答案
按热度按时间bbmckpt71#
我使用
guard
来实现:当然,由于需要
guard
退出作用域,因此可能会有点尴尬。但是,通过将整个事情放入其自己的函数或方法中,很容易避开这一点:当你放弃对早期系统的支持时,这真的很容易删除。
093gszye2#
在Swift 5.6中,您可以执行以下操作:
或者根据您的情况仅提供以下内容:
这是SE-0290: Negative availability的一部分。
bvjxkvbb3#
在
#available
语句周围不可能有逻辑。事实上,编译器使用该语句来推断在它包含的范围内可以调用哪些方法,因此在运行时不能做任何有条件地执行该块的事情。
但是可以使用逗号合并条件,如下所示
vdgimpew4#
看起来这是最好的解决方案,在Swift2之前,你必须使用其他方法,比如使用个人编写的现成的类。不过没关系,您可以在
viewDidLoad()
中设置一个变量,并使用它来检测旧设备:wgx48brx5#
Swift 5.6
Swift 5.5及更早版本
一种简单的检查方法是使用
#available
和guard
语句另一种方法是使用if/else