我想僅在運行早於iOS8
的操作系統的設備上執行代碼塊。我不能這樣做:否定語句#可用語句
if #available(iOS 8.0, *) == false {
doFoo()
}
現在我使用的解決方案是:
if #available(iOS 8.0, *) { } else {
doFoo()
}
,但感覺笨重。有沒有另外一種方法可以用Swift優雅地否定#available
聲明?
我想僅在運行早於iOS8
的操作系統的設備上執行代碼塊。我不能這樣做:否定語句#可用語句
if #available(iOS 8.0, *) == false {
doFoo()
}
現在我使用的解決方案是:
if #available(iOS 8.0, *) { } else {
doFoo()
}
,但感覺笨重。有沒有另外一種方法可以用Swift優雅地否定#available
聲明?
它是不可能有圍繞#available
陳述邏輯。
確實,編譯器使用該語句來推斷可以在其擁抱的範圍內調用哪些方法,因此在運行時不會有條件地執行該塊的任何操作。
這是可能的,雖然用逗號結合條件,如下
if #available(iOS 8.0, *), myNumber == 2 {
// some code
}
看起來這是最好的解決方案,在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
}
}
我使用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
}
}
這是很容易,當你放棄對早期系統支持刪除。
如果你問我這個問題,使用'guard'就會感覺非常Swifty - 很好的破解! :-) –
檢查操作系統版本並不是一個好主意。正確的做法是查看是否存在類或方法。 – rmaddy
@rmaddy你所說的話根本不是真的。 WWDC視頻中有一部分內容涉及到完成此操作。 – TheCodingArt
@rmaddy閱讀這樣的https://www.bignerdranch.com/blog/hi-im-available/。 – TheCodingArt