swift学习之枚举

相比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 {
    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 枚举类型名称
{
    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)
}

你可能感兴趣的:(swift学习之枚举)