Swift 2.0 中,引入了可用性的概念。對(duì)于函數(shù),類,協(xié)議等,可以使用@available聲明這些類型的生命周期依賴于特定的平臺(tái)和操作系統(tǒng)版本。而#available用在判斷語(yǔ)句中(if, guard, while等),在不同的平臺(tái)上做不同的邏輯。
@available
用法
@available放在函數(shù)(方法),類或者協(xié)議前面。表明這些類型適用的平臺(tái)和操作系統(tǒng)??聪旅嬉粋€(gè)例子:
@available(iOS9, *)funcmyMethod(){// do something}
@available(iOS 9, *)必須包含至少2個(gè)特性參數(shù),其中iOS 9表示必須在 iOS 9 版本以上才可用。如果你部署的平臺(tái)包括 iOS 8 , 在調(diào)用此方法后,編譯器會(huì)報(bào)錯(cuò)。
另外一個(gè)特性參數(shù):星號(hào)(*),表示包含了所有平臺(tái),目前有以下幾個(gè)平臺(tái):
iOS
iOSApplicationExtension
OSX
OSXApplicationExtension
watchOS
watchOSApplicationExtension
tvOS
tvOSApplicationExtension
一般來(lái)講,如果沒(méi)有特殊的情況,都使用*表示全平臺(tái)。
@available(iOS 9, *)是一種簡(jiǎn)寫形式。全寫形式是@available(iOS, introduced=9.0)。introduced=9.0參數(shù)表示指定平臺(tái)(iOS)從 9.0 開始引入該聲明。為什么可以采用簡(jiǎn)寫形式呢?當(dāng)只有introduced這樣一種參數(shù)時(shí),就可以簡(jiǎn)寫成以上簡(jiǎn)寫形式。同理:@available(iOS 8.0, OSX 10.10, *) 這樣也是可以的。表示同時(shí)在多個(gè)平臺(tái)上(iOS 8.0 及其以上;OSX 10.10及其以上)的可用性。
另外,@available還有其他一些參數(shù)可以使用,分別是:
deprecated=版本號(hào):從指定平臺(tái)某個(gè)版本開始過(guò)期該聲明
obsoleted=版本號(hào):從指定平臺(tái)某個(gè)版本開始廢棄(注意棄用的區(qū)別,deprecated是還可以繼續(xù)使用,只不過(guò)是不推薦了,obsoleted是調(diào)用就會(huì)編譯錯(cuò)誤)該聲明
message=信息內(nèi)容:給出一些附加信息
unavailable:指定平臺(tái)上是無(wú)效的
renamed=新名字:重命名聲明
以上參數(shù)具體可以參考官方文檔
available
#available用在條件語(yǔ)句代碼塊中,判斷不同的平臺(tái)下,做不同的邏輯處理,比如:
if#available(iOS 8, *) {// iOS 8 及其以上系統(tǒng)運(yùn)行}guard#available(iOS 8, *)else{return//iOS 8 以下系統(tǒng)就直接返回}
stackoverflow 相關(guān)問(wèn)題整理
Difference between @available and #available in swift 2.0: @available 和 #available
帖子里面還提到一個(gè)問(wèn)題:@available是編譯期間判斷的嗎?而#available是運(yùn)行時(shí)行為嗎?
參考資料
API Availability Checking in Swift 2
Availability checking in Swift 2: backwards compatibility the smart way