鑒于昨天開會(huì)部門會(huì)議討論的時(shí)候跪但,發(fā)現(xiàn)有些朋友對(duì)枚舉的用法還是存在一些疑問,所以就寫下這個(gè)文章茄靠,介紹下Swift下的枚舉的用法茂契。
基本的枚舉類型
來,二話不說慨绳,我們先貼一個(gè)最基本的枚舉:
enum Movement {
case letf
case right
case top
case bottom
}
這里就定義了一個(gè)簡單的方向枚舉掉冶,有上下左右四個(gè)方面的case真竖。那么我們可以做些什么操作呢?
1厌小、你可以遍歷他的枚舉:
let aMovement = Movement.left
switch aMovement {
case .left:
print("Left")
default:()
}
2恢共、你可以對(duì)場(chǎng)景進(jìn)行比較:
if aMovement == .left {
print("Left")
}
枚舉值
與OC不一樣,Swift的枚舉牛逼得多了璧亚,OC只能玩Int讨韭,他能玩:
- 整型(Integer)
- 浮點(diǎn)數(shù)(Float Point)
- 字符串(String)
- 布爾類型(Boolean)
enum Movement:Int {
case left = 0
case right = 1
case top = 2
case bottom = 3
}
enum Area: String {
case DG = "dongguan"
case GZ = "guangzhou"
case SZ = "shenzhen"
}
不過,你要是想玩?zhèn)€自定義的類關(guān)聯(lián)類型癣蟋,那還是不行的透硝,不過,已經(jīng)夠用了疯搅。如果你想要或者枚舉的case對(duì)應(yīng)的值濒生,只需要print(Area.DG.rawValue)
這樣調(diào)用就可以了,直接調(diào)用對(duì)應(yīng)的rawValue
秉撇。不過有一點(diǎn)要注意哈甜攀,你如果用rawValue
來構(gòu)造一個(gè)枚舉對(duì)象,他是有可能不在任何一個(gè)場(chǎng)景的琐馆,因?yàn)椋姆祷刂凳强蛇x的恒序。
嵌套枚舉
enum Area {
enum DongGuan {
case NanCheng
case DongCheng
}
enum GuangZhou {
case TianHe
case CheBei
}
}
print(Area.DongGuan.DongCheng)
上代碼瘦麸,一目了然,怎么調(diào)歧胁,直接看滋饲,哈哈~~~
關(guān)聯(lián)值
這個(gè)關(guān)聯(lián)值的說法就比較學(xué)術(shù)了,其實(shí)很簡單喊巍,我們平時(shí)也經(jīng)常用:
enum Trade {
case Buy(stock:String,amount:Int)
case Sell(stock:String,amount:Int)
}
let trade = Trade.Buy(stock: "003100", amount: 100)
switch trade {
case .Buy(let stock,let amount):
print("stock:\(stock),amount:\(amount)")
case .Sell(let stock,let amount):
print("stock:\(stock),amount:\(amount)")
default:
()
}
你看屠缭,其實(shí)就是枚舉的case可以傳值,不要小看這功能崭参,放在OC里面呵曹,要寫這樣的代碼,麻煩了去了何暮。
方法和屬性
先上代碼:
enum Device {
case iPad, iPhone, AppleTV, AppleWatch
func introduced() -> String {
switch self {
case .iPad: return "iPad"
case .iPhone: return "iPhone"
case .AppleWatch: return "AppleWatch"
case .AppleTV: return "AppleTV"
}
}
}
print(Device.iPhone.introduced())
很清晰奄喂,我們定義了一個(gè)設(shè)備枚舉,有iPad, iPhone, AppleTV, AppleWatch海洼,還有一個(gè)介紹的方法跨新。這里的introduced
方法,你可以認(rèn)為枚舉是一個(gè)類坏逢,introduced
是一個(gè)成員方法域帐,Device.iPhone就是一個(gè)Device的實(shí)例赘被,case們是他的屬性,好了肖揣,有了這個(gè)對(duì)像帘腹,Device.iPhone可以認(rèn)為,Device里面有一個(gè)匿名屬性许饿,現(xiàn)在設(shè)置這個(gè)屬性為iPhone阳欲。好了,introduced里面的switch self
陋率,其實(shí)就是遍歷這個(gè)匿名屬性的所有場(chǎng)景球化,如iPad,iPhone等瓦糟,然后根據(jù)不同的場(chǎng)景返回不同的值筒愚。
屬性
增加一個(gè)存儲(chǔ)屬性到枚舉中不被允許,但你依然能夠創(chuàng)建計(jì)算屬性菩浙。當(dāng)然巢掺,計(jì)算屬性的內(nèi)容都是建立在枚舉值下或者枚舉關(guān)聯(lián)值得到的。
enum Device {
case iPad, iPhone
var year: Int {
switch self {
case iPhone: return 2007
case iPad: return 2010
}
}
}
靜態(tài)方法
enum Device {
case iPad, iPhone, AppleTV, AppleWatch
func introduced() -> String {
switch self {
case .iPad: return "iPad"
case .iPhone: return "iPhone"
case .AppleWatch: return "AppleWatch"
case .AppleTV: return "AppleTV"
}
}
static func fromSlang(term: String) -> Device? {
if term == "iWatch" {
return .AppleWatch
}
return nil
}
}
print(Device.fromSlang(term: "iWatch"))
static func fromSlang(term: String) -> Device?
就是一個(gè)靜態(tài)方法劲蜻。
協(xié)議
Swift也允許你在枚舉中使用協(xié)議(Protocols)和協(xié)議擴(kuò)展(Protocol Extension)陆淀。
Swift協(xié)議定義一個(gè)接口或類型以供其他數(shù)據(jù)結(jié)構(gòu)來遵循。enum當(dāng)然也不例外先嬉。我們先從Swift標(biāo)準(zhǔn)庫中的一個(gè)例子開始.
CustomStringConvertible是一個(gè)以打印為目的的自定義格式化輸出的類型轧苫。
protocol CustomStringConvertible {
var description: String { get }
}
該協(xié)議只有一個(gè)要求,即一個(gè)只讀(getter)類型的字符串(String類型)疫蔓。我們可以很容易為enum實(shí)現(xiàn)這個(gè)協(xié)議含懊。
enum Trade :CustomStringConvertible{
case Buy(stock:String,amount:Int)
case Sell(stock:String,amount:Int)
var description: String {
switch self {
case .Buy(_, _):
return "Buy"
case .Sell(_, _):
return "Sell"
}
}
}
print(Trade.Buy(stock: "003100", amount: 100).description)
擴(kuò)展
枚舉也可以進(jìn)行擴(kuò)展。最明顯的用例就是將枚舉的case和method分離衅胀,這樣閱讀你的代碼能夠簡單快速地消化掉enum內(nèi)容岔乔,緊接著轉(zhuǎn)移到方法定義:
enum Device {
case iPad, iPhone, AppleTV, AppleWatch
}
extension Device: CustomStringConvertible{
func introduced() -> String {
switch self {
case .iPad: return "iPad"
case .iPhone: return "iPhone"
case .AppleWatch: return "AppleWatch"
case .AppleTV: return "AppleTV"
}
}
var description: String {
switch self {
case .iPad: return "iPad"
case .iPhone: return "iPhone"
case .AppleWatch: return "AppleWatch"
case .AppleTV: return "AppleTV"
}
}
}
print(Device.AppleTV.description)
print(Device.iPhone.introduced())
泛型
enum Rubbish<T> {
case price(T)
func getPrice() -> T {
switch self {
case .price(let value):
return value
}
}
}
print(Rubbish<Int>.price(100).getPrice())
好了,基本上就這些吧滚躯,有要補(bǔ)充的話雏门,求回復(fù)~~~~~