鑑於昨天開會部門會議討論的時候,發現有些朋友對列舉的用法還是存在一些疑問,所以就寫下這個文章,介紹下Swift下的列舉的用法。 ###基本的列舉型別 來,二話不說,我們先貼一個最基本的列舉:
enum Movement {
case letf
case right
case top
case bottom
}
複製程式碼
這裡就定義了一個簡單的方向列舉,有上下左右四個方面的case。那麼我們可以做些什麼操作呢? 1、你可以遍歷他的列舉:
let aMovement = Movement.left
switch aMovement {
case .left:
print("Left")
default:()
}
複製程式碼
2、你可以對場景進行比較:
if aMovement == .left {
print("Left")
}
複製程式碼
###列舉值 與OC不一樣,Swift的列舉牛逼得多了,OC只能玩Int,他能玩:
- 整型(Integer)
- 浮點數(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"
}
複製程式碼
不過,你要是想玩個自定義的類關聯型別,那還是不行的,不過,已經夠用了。如果你想要或者列舉的case對應的值,只需要print(Area.DG.rawValue)
這樣呼叫就可以了,直接呼叫對應的rawValue
。不過有一點要注意哈,你如果用rawValue
來構造一個列舉物件,他是有可能不在任何一個場景的,因為,他的返回值是可選的。
###巢狀列舉
enum Area {
enum DongGuan {
case NanCheng
case DongCheng
}
enum GuangZhou {
case TianHe
case CheBei
}
}
print(Area.DongGuan.DongCheng)
複製程式碼
上程式碼,一目瞭然,怎麼調,直接看,哈哈~~~
###關聯值 這個關聯值的說法就比較學術了,其實很簡單,我們平時也經常用:
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:
()
}
複製程式碼
你看,其實就是列舉的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())
複製程式碼
很清晰,我們定義了一個裝置列舉,有iPad, iPhone, AppleTV, AppleWatch,還有一個介紹的方法。這裡的introduced
方法,你可以認為列舉是一個類,introduced
是一個成員方法,Device.iPhone就是一個Device的例項,case們是他的屬性,好了,有了這個對像,Device.iPhone可以認為,Device裡面有一個匿名屬性,現在設定這個屬性為iPhone。好了,introduced裡面的switch self
,其實就是遍歷這個匿名屬性的所有場景,如iPad,iPhone等,然後根據不同的場景返回不同的值。
###屬性 增加一個儲存屬性到列舉中不被允許,但你依然能夠建立計算屬性。當然,計算屬性的內容都是建立在列舉值下或者列舉關聯值得到的。
enum Device {
case iPad, iPhone
var year: Int {
switch self {
case iPhone: return 2007
case iPad: return 2010
}
}
}
複製程式碼
###靜態方法
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?
就是一個靜態方法。
###協議 Swift也允許你在列舉中使用協議(Protocols)和協議擴充套件(Protocol Extension)。 Swift協議定義一個介面或型別以供其他資料結構來遵循。enum當然也不例外。我們先從Swift標準庫中的一個例子開始. CustomStringConvertible是一個以列印為目的的自定義格式化輸出的型別。
protocol CustomStringConvertible {
var description: String { get }
}
複製程式碼
該協議只有一個要求,即一個只讀(getter)型別的字串(String型別)。我們可以很容易為enum實現這個協議。
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)
複製程式碼
###擴充套件 列舉也可以進行擴充套件。最明顯的用例就是將列舉的case和method分離,這樣閱讀你的程式碼能夠簡單快速地消化掉enum內容,緊接著轉移到方法定義:
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())
複製程式碼
好了,基本上就這些吧,有要補充的話,求回覆~~~~~