相比OC的枚举类型,swift的枚举类型就方便的多,OC的枚举类型成员属性只能是整数NSInterger(C语言的枚举就是一对整形常量的集合)
,而swift没有这样限制,更不会像OC那样隐式给成员赋值整数,在不指定类型的情况下,swift的枚举成员本身就是值
普通枚举
定义格式
enum 枚举类型名称:(可有可无的成员类型)
{
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
其实就是枚举类型规定成员类型
定义格式:
enum 枚举类型名称:成员类型
{
case 枚举成员1=1
case 枚举成员2=2
...
case 枚举成员n=n
}
上边的成员的值不用是连续的
这样的定义就会给枚举类型提供一个新的构造方法
枚举类型名称(rowValue:输入值)
enum NetworkError:String
{
case NetworkErroLogic = "这是一个逻辑错误,网络请求成功"
case NetworkErrorRequest = "这是一个网络请求错误"
}
let networkError:NetworkError = .NetworkErrorRequest
print(networkError)
print(networkError.rawValue)
带有关联值的枚举(成员是可以关联多个值,可以认为是关联一个元组,关联值枚举不能申明为rawValue,这个家伙的成员是一个常量,一经定义不能再变的,关联枚举的关联值是可变的,决定着他本身是可变的)
带有关联值的枚举的成员都会带有额外的信息
定义格式
enum 枚举类型名称
{
case 枚举成员1(关联值1)
case 枚举成员2(关联值2)
...
case 枚举成员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
}
}
}
枚举结合范型
定义格式
enum 枚举类型名称<T1,T2...,Tn>
{
case 枚举成员1(T1类型关联值1)
case 枚举成员2(T2类型关联值2)
...
case 枚举成员n(Tn类型关联值3)
}
关联值提取
在switch语法的case中要使用关联值就必须
将关联值提取出来作为switch语句的一部分。可以在switch的 case 分支代码中提取每个关联值作为一个常量(用let前缀)或者作为一个变量(用var前缀)来使用,多个关联值之间用逗号隔开。如果有多个关联值都作为常量或者都作为变量提取,通常将let或者var提到case关键字后面。
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)
}
网友评论