在 Swift 中,枚舉是一個很是方便也很是強大的類型。咱們在平常使用中也常常會使用到它。bash
例如,咱們最多見的 optional:ui
enum Optional<T> {
case Some(T)
case None
}
複製代碼
這裏不許備介紹枚舉的基本用法,只是記錄兩個比較好用的枚舉用法。spa
關聯值是將額外信息附加到 enum case 中的一種極好的方式。code
例如,當咱們須要將一系列的值傳到下一個類中時,通常狀況下咱們像下方代碼同樣寫出幾個設置的方法:ci
struct MyStruct {
var value: Int
init(_ value: Int?) {
if let val = value {
self.value = val
} else {
self.value = Int(INT_MAX)
}
}
}
class Two {
var value1: String?
var value2: Int?
var value3: MyStruct?
func setValue1(value: String?) { }
func setValue2(value: Int?) { }
func setValue2(value: MyStruct?) { }
}
複製代碼
這樣當須要傳的值變多時,代碼無疑就會變得沒那麼好看了。咱們能夠用枚舉來簡化:get
enum ValueBind {
case bindStringValue(str: String)
case bindIntValue(num: Int)
case bindModel(model: MyStruct)
}
class Two {
var value1: String?
var value2: Int?
var value3: MyStruct?
func setValueBind(value: ValueBind) {
switch value {
case .bindStringValue(let str):
print(str)
case .bindModel(let model):
print(model.value)
case .bindIntValue(let num)
print(num)
}
}
}
複製代碼
利用枚舉關聯值以後,我們的代碼立刻就簡潔了很多。string
日常咱們使用枚舉時,咱們在爲枚舉定義 value 時,通常就只用了幾種基本的類型:it
enum Direction {
case left
case top
case right
case bottom
}
enum StringEnum: String {
case hello = "hello"
case world = "world"
}
enum IntEnum: Int {
case one = 1
case two = 2
}
複製代碼
可是,若是咱們須要在枚舉類型放入咱們自定義的類型的話,咱們就須要爲枚舉加一些東西了。io
enum CustomEnum: RawRepresentable {
typealias RawValue = MyStruct
case null
case one
case two
init?(rawValue: MyStruct) {
switch rawValue.value {
case 1:
self = .one
case 2:
self = .two
default:
self = .null
}
}
var rawValue: MyStruct {
switch self {
case .one:
return MyStruct(1)
case .two:
return MyStruct(2)
default:
return MyStruct(nil)
}
}
}
複製代碼
咱們讓枚舉遵照 RawRepresentable 協議,並實現協議的一些屬性及方法:table
/*
將枚舉的 RawValue 關聯爲本身但願的類型
**/
associatedtype RawValue
/*
利用本身關聯的類型生成枚舉的實例
**/
init?(rawValue: Self.RawValue)
/*
將本身定義的類型的做爲 RawValue 返回
**/
var rawValue: Self.RawValue { get }
複製代碼