尊重知識,轉發(fā)請注明出處:Swift枚舉實戰(zhàn)
概要
枚舉(enum)我們再熟悉不過的數(shù)據(jù)類型备闲,縱觀C挤安、OC、Swift戈鲁,枚舉的定義基本都是一樣的:枚舉是一個被命名的常量的集合仇参。本文主要介紹我在項目開發(fā)中用到的Swift枚舉的一些實用經(jīng)驗。
C語言的枚舉比較簡單婆殿,絕大部分書籍在講解枚舉語法時都很難超過2頁诈乒。
OC中的枚舉是基于C語言的枚舉,不同的是OC對枚舉進行了很多擴展婆芦,使其功能性更加豐富怕磨。
Swift中的枚舉則是完全不同的一種數(shù)據(jù)類型,具有很多面向對象的特點消约,語法簡潔肠鲫,功能豐富,同時在很多地方更符合人們對于世界的直觀印象或粮。
再也沒必要讓你的枚舉成員只能是整型了
還是那個主要學習枚舉就逃不開的例子:季節(jié)
enum Season {
case spring
case summer
case autumn
case winter
}
上面是用Swift枚舉定義的季節(jié)导饲,乍一看沒什么不同,無非是多了關鍵字case
氯材,在C和OC中spring
的默認值是0渣锦,summer
是1,后續(xù)依次類推氢哮,而在Swift中并沒有給每一個枚舉成員分配默認值袋毙,Swift的枚舉名就是一個枚舉實例,對應這個一個枚舉值冗尤。這種做法更加符合人類對世界的認知娄猫,春天就是春天,不是整數(shù)0生闲,夏天就是夏天媳溺,也不是整數(shù)1。
當然Swift也是支持為每一個枚舉成員指定類型的碍讯,更加可喜的是悬蔽,指定的類型再也不僅限于Int
了,還可以是String
捉兴、NSNumber
等我們常用的類型蝎困。如下:
enum Season: Int {
case spring
case summer
case autumn
case winter
}
enum Season: String {
case spring
case summer
case autumn
case winter
}
更加靈活的使用枚舉
在開發(fā)中時常需要從服務器獲取數(shù)據(jù)录语,然后判斷,比如服務器傳“0”
代表春天禾乘,這個“0”
有可能是字符串或者NSNumber澎埠,我們可以統(tǒng)一轉換成字符串术瓮,然后再轉換成整型经伙,與OC中的Season枚舉對比判斷。
在Swift中由于可以為枚舉的原始值指定String類型辜御,因此將從服務器不僅僅可以傳“0”
代表春天了伍派,也可以直接傳“spring”
字符串江耀,這樣就不會出現(xiàn)產數(shù)字時會出現(xiàn)的NSNumber類型了,同時使用起來也更加方便诉植,代碼如下;
enum Season: String {
case spring
case summer
case autumn
case winter
}
//假設這是從服務器獲取的季節(jié)數(shù)據(jù)
let season = "autumn"
switch season {
case Season.spring.rawValue:
break
case Season.summer.rawValue:
break
case Season.autumn.rawValue:
break
case Season.winter.rawValue:
break
default :
break
}
注意: rawValue是枚舉成員的原始值祥国,類型就是定義枚舉時指定的,這里是String晾腔;
上面的雖然可以直接使用服務器獲取的字符串舌稀,但是還是很繁瑣,尤其是枚舉成員很多時灼擂,可以做如下的變動:
enum Season: String {
case spring
case summer
case autumn
case winter
}
//假設這是從服務器獲取的季節(jié)數(shù)據(jù)
let season = "autumn"
if let endSeason = Season(rawValue: season) {
switch endSeason {
case .spring:
break
case .summer:
break
case .autumn:
break
case .winter:
break
}
注意: 1壁查、通過Swift構造器可以將字符串轉換成枚舉類型,但是這里需要注意的是這是一個可失敗的構造器缤至,也就是有可能服務器給的字符串并不對潮罪,導致得到的枚舉值是空康谆,所以這里可以使用可選綁定防止崩潰领斥; 2、當獲取到由字符串轉化來的季節(jié)枚舉值后沃暗,使用switch就很簡單了月洛,Swift支持直接使用點語法調用枚舉成員,這樣我們只需要一個點就可以很方便的調出各個枚舉成員了孽锥; 3嚼黔、這里省略了default分支,其實很容易理解惜辑,因為枚舉的成員數(shù)量是固定的唬涧,將所有的枚舉成員都列舉出來,自然不會再出現(xiàn)default分支盛撑。
監(jiān)聽枚舉值
假如我們的程序會根據(jù)季節(jié)的不同更換相應的季節(jié)背景圖碎节,而季節(jié)是一個隨機變化枚舉,這時我們需要監(jiān)聽枚舉值的變化抵卫,實時改變背景圖狮荔,無論是使用通知胎撇、KVO、代理等等都不容易實現(xiàn)殖氏,而在Swift中就變得很簡單了晚树。代碼如下:
var season = Season.spring {
willSet {
if newValue != season {
print("季節(jié)即將發(fā)生變化")
}
}
didSet {
if oldValue != season {
print("季節(jié)已經(jīng)發(fā)生變化")
}
}
}
這里使用了屬性觀察者,C和OC中的枚舉沒有屬性這個概念雅采,而Swift中的枚舉更像是一個對象爵憎,因此可以很方便的使用這個功能實現(xiàn)對枚舉值的監(jiān)聽。
注意: 1总滩、willSet是枚舉值在即將被賦值之前調用的纲堵,而didSet是枚舉值被改變之后調用的,時間點不一樣唯一闰渔,大家可以根據(jù)實際的情況選认; 2冈涧、willSet中的的newValue是即將被改變的枚舉值茂附,而didSet中的oldValue是已經(jīng)改變的枚舉值,這個是Swift提供的隱式形參名督弓,直接寫出來就可以了营曼。
尾巴
當然Swift還有關聯(lián)值,也就相當于為每一個枚舉成員增加“屬性”愚隧,這個功能我在項目中暫時還沒有應用到蒂阱,相信也會有很大的用處,小伙伴們可以自己嘗試一下狂塘。這里簡單總結下我使用Swift的枚舉的經(jīng)驗录煤,希望能幫助到大家。