我只想在运行OS早于iOS8
的设备上执行代码块。我不能这样做:
if #available(iOS 8.0, *) == false {
doFoo()
}
我现在使用的解决方案是:
if #available(iOS 8.0, *) { } else {
doFoo()
}
,但感觉很笨重。还有另一种方法可以优雅地用Swift来否定#available
语句吗?
答案 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
}