2015-09-17 89 views
13

我想僅在運行早於iOS8的操作系統的設備上執行代碼塊。我不能這樣做:否定語句#可用語句

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

現在我使用的解決方案是:

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

,但感覺笨重。有沒有另外一種方法可以用Swift優雅地否定#available聲明?

+0

檢查操作系統版本並不是一個好主意。正確的做法是查看是否存在類或方法。 – rmaddy

+3

@rmaddy你所說的話根本不是真的。 WWDC視頻中有一部分內容涉及到完成此操作。 – TheCodingArt

+0

@rmaddy閱讀這樣的https://www.bignerdranch.com/blog/hi-im-available/。 – TheCodingArt

回答

4

它是不可能有圍繞#available陳述邏輯。

確實,編譯器使用該語句來推斷可以在其擁抱的範圍內調用哪些方法,因此在運行時不會有條件地執行該塊的任何操作。

這是可能的,雖然用逗號結合條件,如下

if #available(iOS 8.0, *), myNumber == 2 { 
    // some code 
} 
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 
    } 
} 
8

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

如果你問我這個問題,使用'guard'就會感覺非常Swifty - 很好的破解! :-) –