Swift列舉的全用法

AndreaArlex同志發表於2019-04-19

鑑於昨天開會部門會議討論的時候,發現有些朋友對列舉的用法還是存在一些疑問,所以就寫下這個文章,介紹下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來構造一個列舉物件,他是有可能不在任何一個場景的,因為,他的返回值是可選的。

image.png

###巢狀列舉

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())
複製程式碼

好了,基本上就這些吧,有要補充的話,求回覆~~~~~

相關文章