24.swift枚舉

import Foundation

/*

Swift枚舉:

Swift中的枚舉比OC中的枚舉強大, 因爲Swift中的枚舉是一等類型, 它可以像類和結構體一樣增加屬性和方法

格式:

enum Method{

    case 枚舉值

}

*/


enum Method{

//    case Add

//    case Sub

//    case Mul

//    case Div

    // 可以連在一起寫

    case Add, Sub, Mul, Div

}

// 可以使用枚舉類型變量或常量接收枚舉值

var m: Method = .Add

// 注意: 如果變量或常量沒有指定類型, 那麼前面必須加上該值屬於哪個枚舉類型

var m1 = Method.Add



// 利用Switch匹配

// 注意: 如果case中包含了所有的值, 可以不寫default. 如果case中沒有包含枚舉中所有的值, 必須寫default

switch (Method.Add){

    case Method.Add:

        print("加法")

    case Method.Sub:

        print("減法")

    case Method.Mul:

        print("除法")

    case Method.Div:

        print("乘法")

//    default:

//        print("都不是")

}


/*

原始值:

 OC中枚舉的本質就是整數,所以OC中的枚舉是有原始值的,默認是從0開始

Swift中的枚舉默認是沒有原始值的, 但是可以在定義時告訴系統讓枚舉有原始值

enum Method: 枚舉值原始值類型{

    case 枚舉值

}

*/


enum Method2: Int{

    // 可以連在一起寫

    case Add, Sub, Mul, Div

}

// OC中的枚舉一樣, 也可以指定原始值, 後面的值默認+1

enum Method3: Int{

    case Add = 5, Sub, Mul, Div

}


// Swift中的枚舉除了可以指定整形以外還可以指定其它類型, 但是如果指定其它類型, 必須給所有枚舉值賦值, 因爲不能自動遞增

enum Method4: Double{

    // 可以連在一起寫

    case Add = 5.0, Sub = 6.0, Mul = 6.1, Div = 8.0

}

// rawValue代表將枚舉值轉換爲原始值, 注意老版本中轉換爲原始值的方法名叫toRaw

print(Method4.Sub.rawValue)



// 原始值轉換爲枚舉值

enum Method5: String{

    case Add = "add", Sub = "sub", Mul = "mul", Div = "div"

}


// 通過原始值創建枚舉值

/*

注意

1.原始值區分大小寫

2.返回的是一個可選值,因爲原始值對應的枚舉值不一定存在

3.老版本中爲fromRaw("add")

*/

let m2 = Method5(rawValue: "add")

print(m2)


//func chooseMethod(op:Method2)

    func chooseMethod(op:String)

{

    // 由於返回是可選類型, 所以有可能爲nil, 最好使用可選綁定

    if let opE = Method5(rawValue: op){

        switch (opE){

        case .Add:

            print("加法")

        case .Sub:

            print("減法")

        case .Mul:

            print("除法")

        case .Div:

            print("乘法")

        }

    }

}



/*

枚舉相關值:

可以讓枚舉值對應的原始值不是唯一的, 而是一個變量.

每一個枚舉可以是在某種模式下的一些特定值

*/

enum lineSegmentDescriptor{

    case StartAndEndPattern(start:Double, end:Double)

    case StartAndLengthPattern(start: Double, length:Double)

}


var lsd = lineSegmentDescriptor.StartAndLengthPattern(start: 0.0, length: 100.0)

lsd = lineSegmentDescriptor.StartAndEndPattern(start: 0.0, end: 50.0)

// 利用switch提取枚舉關聯值

/*

switch lsd

{

    case .StartAndEndPattern(let s, let e):

        print("start = \(s) end = \(e)")

    case .StartAndLengthPattern(let s, let l):

        print("start = \(s) lenght = \(l)")

}

*/


// 提取關聯值優化寫法

switch lsd

{

        case let .StartAndEndPattern(s, e):

            print("start = \(s) end = \(e)")

        case .StartAndLengthPattern(let s, let l):

            print("start = \(s) lenght = \(l)")

}


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章