相比OC的枚舉類型巩螃,swift的枚舉類型就方便的多,OC的枚舉類型成員屬性只能是整數(shù)NSInterger(C語(yǔ)言的枚舉就是一對(duì)整形常量的集合)
,而swift沒(méi)有這樣限制掠手,更不會(huì)像OC那樣隱式給成員賦值整數(shù)柳恐,在不指定類型的情況下伐脖,swift的枚舉成員本身就是值
普通枚舉
定義格式
enum 枚舉類型名稱:(可有可無(wú)的成員類型)
{
case 枚舉成員1
case 枚舉成員2
...
case 枚舉成員n
}
enum 枚舉類型名稱
{
case 枚舉成員1,枚舉成員2,...,枚舉成員n
}
//用戶身份類型
enum UserIdentityType
{
case UserIdentityTypeNone
case UserIdentityTypeNormal
case UserIdentityTypeCourier
case UserIdentityTypeSeller
}
var userType:UserIdentityType = .UserIdentityTypeCourier
原始值(成員是常量)
raw value
其實(shí)就是枚舉類型規(guī)定成員類型
定義格式:
enum 枚舉類型名稱:成員類型
{
case 枚舉成員1=1
case 枚舉成員2=2
...
case 枚舉成員n=n
}
上邊的成員的值不用是連續(xù)的
這樣的定義就會(huì)給枚舉類型提供一個(gè)新的構(gòu)造方法
枚舉類型名稱(rowValue:輸入值)
enum NetworkError:String
{
case NetworkErroLogic = "這是一個(gè)邏輯錯(cuò)誤热幔,網(wǎng)絡(luò)請(qǐng)求成功"
case NetworkErrorRequest = "這是一個(gè)網(wǎng)絡(luò)請(qǐng)求錯(cuò)誤"
}
let networkError:NetworkError = .NetworkErrorRequest
print(networkError)
print(networkError.rawValue)
帶有關(guān)聯(lián)值的枚舉(成員是可以關(guān)聯(lián)多個(gè)值,可以認(rèn)為是關(guān)聯(lián)一個(gè)元組讼庇,關(guān)聯(lián)值枚舉不能申明為rawValue绎巨,這個(gè)家伙的成員是一個(gè)常量,一經(jīng)定義不能再變的蠕啄,關(guān)聯(lián)枚舉的關(guān)聯(lián)值是可變的场勤,決定著他本身是可變的)
帶有關(guān)聯(lián)值的枚舉的成員都會(huì)帶有額外的信息
定義格式
enum 枚舉類型名稱
{
case 枚舉成員1(關(guān)聯(lián)值1)
case 枚舉成員2(關(guān)聯(lián)值2)
...
case 枚舉成員n(關(guān)聯(lián)值3)
}
//alamofire事例
public enum Result<Value, Error: ErrorType> {
case Success(Value)
case Failure(Error)
/// Returns `true` if the result is a success, `false` otherwise.
public var isSuccess: Bool {
switch self {
case .Success:
return true
case .Failure:
return false
}
}
/// Returns `true` if the result is a failure, `false` otherwise.
public var isFailure: Bool {
return !isSuccess
}
/// Returns the associated value if the result is a success, `nil` otherwise.
public var value: Value? {
switch self {
case .Success(let value):
return value
case .Failure:
return nil
}
}
/// Returns the associated error value if the result is a failure, `nil` otherwise.
public var error: Error? {
switch self {
case .Success:
return nil
case .Failure(let error):
return error
}
}
}
枚舉結(jié)合范型
定義格式
enum 枚舉類型名稱<T1,T2...,Tn>
{
case 枚舉成員1(T1類型關(guān)聯(lián)值1)
case 枚舉成員2(T2類型關(guān)聯(lián)值2)
...
case 枚舉成員n(Tn類型關(guān)聯(lián)值3)
}
關(guān)聯(lián)值提取
在switch語(yǔ)法的case中要使用關(guān)聯(lián)值就必須
將關(guān)聯(lián)值提取出來(lái)作為switch語(yǔ)句的一部分〖吒可以在switch的 case 分支代碼中提取每個(gè)關(guān)聯(lián)值作為一個(gè)常量(用let前綴)或者作為一個(gè)變量(用var前綴)來(lái)使用和媳,多個(gè)關(guān)聯(lián)值之間用逗號(hào)隔開(kāi)。如果有多個(gè)關(guān)聯(lián)值都作為常量或者都作為變量提取哈街,通常將let或者var提到case關(guān)鍵字后面留瞳。
enum Trades {
case Buy(stock: String, amount: Int, stockPrice: Float)
case Sell(stock: String, amount: Int, stockPrice: Float)
}
let trade = Trades.Buy(stock: "100", amount: 20, stockPrice: 10.0)
switch trade {
//case .Buy(let stock,let amount,let stockPrice):
case let .Buy(stock,amount,stockPrice):
print("\(stock)" + "," + "\(amount)" + "," + "\(stockPrice)");
default:
print("sdfds");
}
枚舉遞歸
indirect enum NetWorkResult {
case Success(Int)
case failure(String)
case Result(NetWorkResult)
}