Swift講解專題九——枚舉

Swift講解專題九——枚舉

1、引言

        在Objective-C語言中,沒有其實是整型數據,Swift中的枚舉則更加靈活,開發者能夠不爲其分配值類型把枚舉做爲獨立的類型來使用,也能夠爲其分配值,能夠是字符,字符串,整型或者浮點型數據。算法

2、枚舉語法

        Swift中enum關鍵字來進行枚舉的建立,使用case來建立每個枚舉值,示例以下:函數

//建立姓氏枚舉,和Objective-C不一樣,Swift枚舉不會默認分配值
enum Surname {
    case 張
    case 王
    case 李
    case 趙
}
//建立一個枚舉類型的變量
var myName = Surname.張
//若是能夠自動推斷出類型 則枚舉類型能夠省略
myName = .李
var myName2:Surname = .王

一樣能夠將枚舉值都寫在同一個case中,使用逗號分隔:spa

enum Planet {
    case Mercury, Venus, Earth, Mars, Jupiter, Saturn, Uranus, Neptune
}

枚舉常常會和Switch語句結合使用,示例以下:code

switch myName {
case .張:
    print("姓氏張")
case .王:
    print("姓氏王")
case .李:
    print("姓氏李")
case .趙:
    print("姓氏趙")
}

3、枚舉的相關值

        Swift中的枚舉有一個頗有意思的特色,其能夠設置一些相關值,經過相關值,開發者能夠從公用的枚舉值中獲取到傳遞的額外相關值,示例以下:對象

enum Number {
    case one(count:Int)
    case two(count:Int)
    case three(count:Int)
    case four(count:Int)
}
var num = Number.one(count: 5)
switch num {
    //獲取num的相關值
case Number.one(let count):
    print(count)
default:
    print(num)
}
//若是一個枚舉值全部的相關中都是常量,let關鍵字也能夠提取到括號外面
switch num {
    //獲取num的相關值
case let Number.one(count):
    print(count)
default:
    print(num)
}

有了相關值這樣的句法,大大的增長了枚舉的靈活性,例如一個形狀枚舉,可能的枚舉值有矩形,圓形等,矩形的枚舉值就能夠提供寬高的相關值,圓形的枚舉值就能夠提供半徑的相關值,是開發更加靈活。遞歸

4、枚舉的原始值

        原始值也能夠理解爲爲枚舉設置一個具體類型,示例以下:three

enum Char:String {
    case a = "A"
    case b = "B"
    case c = "C"
}
//」A「
var char = Char.a.rawValue

注意,若是枚舉是Int類型的,則相似於Objective-C,枚舉的原始值會從第一個開始以後依次遞增:開發

enum Char:Int{
    case a = 0
    case b
    case c
}
//1
var char = Char.b.rawValue

一樣能夠經過原始值的方式來進行枚舉對象的建立,示例以下:字符串

enum Char:Int{
    case a = 0
    case b
    case c
}
//1
var char = Char.b.rawValue
//b
var char2 = Char(rawValue:1)

在經過原始值進行枚舉對象建立的時候,有可能建立失敗,例如傳入的原始值並不存在,這時會返回Optional值nil。it

4、遞歸枚舉

        遞歸枚舉是Swift枚舉中一個難於理解的地方,實際上也並不是十分難於理解,開發者只要明白枚舉的實質,遞歸枚舉就很好理解。首先,遞歸是一種算法,能夠簡單理解爲本身調用本身,而枚舉實際上並非函數,它並不執行某項運算,它只是表達一個數據或者說他也能夠表達一種表達式,示例以下:

enum Expression {
    //表示加
    case add
    //表示減
    case mul
}

前面有提到過相關值的概念,所以,對於上述例子,能夠爲add和mul枚舉值添加兩個相關值做爲參數。

enum Expression {
    //表示加
    case add(Int,Int)
    //表示減
    case mul(Int,Int)
}

如此,以下的寫法實際上就能夠表明一個5+5的表達式:

var exp = Expression.add(5, 5)

仍是須要強調一點,這個exp只是表達了5+5這樣一個約定的表達式,它並無真正進行5+5的運算。如今問題就來了,使用如上的枚舉,怎樣來表達相似(5+5)*5這樣的複合表達式呢?可使用遞歸枚舉來實現,即將(5+5)做爲枚舉值得相關值再次建立枚舉,改造以下:

enum Expression {
    //單值數據
    case num(Int)
    //表示加 indirect爲遞歸枚舉關鍵字
    indirect case add(Expression,Expression)
    //表示減
    indirect case mul(Expression,Expression)
}
var exp1 = Expression.num(5)
var exp2 = Expression.num(5)
var exp3 = Expression.add(exp1, exp2)
var exp4 = Expression.mul(exp1, exp3)

上面exp4實際上就表達了(5+5)*5這樣一個過程,注意遞歸的枚舉值必須加上indirect關鍵字來聲明。處理遞歸枚舉最好的方式是經過遞歸函數,示例以下:

func expFunc(param:Expression) -> Int {
    //進行枚舉判斷
    switch param {
        //若是是單獨數字 直接返回
    case .num(let p):
        return p
        //若是是加法 則進行遞歸加
    case .add(let one, let two):
        return expFunc(one)+expFunc(two)
        //若是是乘法 則進行遞歸乘
    case .mul(let one, let two):
        return expFunc(one)*expFunc(two)
    }
}
//50
expFunc(exp4)

若是枚舉中全部的case都是可遞歸的,能夠將整個枚舉聲明爲可遞歸的:

indirect enum Expression {
    //單值數據
    case num(Int)
    //表示加 indirect爲遞歸枚舉關鍵字
    case add(Expression,Expression)
    //表示減
    case mul(Expression,Expression)
}

專一技術,熱愛生活,交流技術,也作朋友。

——琿少 QQ羣:203317592

相關文章
相關標籤/搜索