Swift 中的枚舉更加靈活塑猖,不必給每一個枚舉成員提供一個值。如果給枚舉成員提供一個值(稱為“原始”值),則該值的類型可以是字符串距境,字符,或是一個整型值或浮點數(shù),使用enum關(guān)鍵詞來創(chuàng)建枚舉并且把它們的整個定義放在一對大括號內(nèi),這些枚舉成員的名字大寫字母開頭
import UIKit
class ViewController: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
//******************************枚舉************************
//Swift 中的枚舉更加靈活镣隶,不必給每一個枚舉成員提供一個值。如果給枚舉成員提供一個值(稱為“原始”值)诡右,則該值的類型可以是字符串安岂,字符,或是一個整型值或浮點數(shù),使用enum關(guān)鍵詞來創(chuàng)建枚舉并且把它們的整個定義放在一對大括號內(nèi),這些枚舉成員的名字大寫字母開頭
enum CompassPonit {
case North
case South
case East
case West
}
//枚舉中定義的值(如 North稻爬,South嗜闻,East和West)是這個枚舉的成員值(或成員)。你使用case關(guān)鍵字來定義一個新的枚舉成員值
//多個成員值可以出現(xiàn)在同一行上桅锄,用逗號隔開
enum CompassPonit1{
case North,South,East, West
}
//directionToHead的類型可以在它被CompassPoint的某個值初始化時推斷出來琉雳。一旦directionToHead被聲明為CompassPoint類型样眠,你可以使用更簡短的點語法將其設(shè)置為另一個CompassPoint的值:
var directionToHead = CompassPonit.West
//當(dāng)directionToHead的類型已知時,再次為其賦值可以省略枚舉類型名翠肘。在使用具有顯式類型的枚舉值時檐束,這種寫法讓代碼具有更好的可讀性
directionToHead = .East
//使用switch語句匹配單個枚舉值
switch directionToHead {
case .North:
print("North");
case .East:
print("East")
case .South:
print("South")
case .West:
print("west")
}
//關(guān)聯(lián)值:Swift 枚舉來存儲任意類型的關(guān)聯(lián)值,如果需要的話束倍,每個枚舉成員的關(guān)聯(lián)值類型可以各不相同被丧。枚舉的這種特性跟其他語言中的可識別聯(lián)合(discriminated unions),標(biāo)簽聯(lián)合(tagged unions)绪妹,或者變體(variants)相似甥桂。
enum Barcode{
case MARK1(Int,Int,Int)
case MARK2(String,Int)
}
var pruduct = Barcode.MARK1(1, 2, 3)
pruduct = .MARK2("hhh", 3)
switch pruduct{
case .MARK1(let number1, let number2,let number3):
print("mark1:\(number1),\(number2),\(number3)");
case .MARK2(let string , let number):
print("mark2:\(string),\(number)")
}
//如果一個枚舉成員的所有關(guān)聯(lián)值都被提取為常量,或者都被提取為變量邮旷,為了簡潔黄选,你可以只在成員名稱前標(biāo)注一個let或者var
switch pruduct{
case let .MARK1(number1, number2, number3):
print("mark1:\(number1),\(number2),\(number3)");
case let .MARK2( string , number):
print("mark2:\(string),\(number)")
}
//原始值:在關(guān)聯(lián)值小節(jié)的條形碼例子中,演示了如何聲明存儲不同類型關(guān)聯(lián)值的枚舉成員婶肩。作為關(guān)聯(lián)值的替代選擇办陷,枚舉成員可以被默認(rèn)值(稱為原始值)預(yù)填充,這些原始值的類型必須相同律歼。原始值可以是字符串民镜,字符,或者任意整型值或浮點型值险毁。每個原始值在枚舉聲明中必須是唯一的,原始值和關(guān)聯(lián)值是不同的制圈。原始值是在定義枚舉時被預(yù)先填充的值。對于一個特定的枚舉成員辱揭,它的原始值始終不變离唐。關(guān)聯(lián)值是創(chuàng)建一個基于枚舉成員的常量或變量時才設(shè)置的值,枚舉成員的關(guān)聯(lián)值可以變化
enum testName:String{
case one = "1"
case two = "2"
case three = "3"
}
//原始值的隱式賦值,在使用原始值為整數(shù)或者字符串類型的枚舉時问窃,不需要顯式地為每一個枚舉成員設(shè)置原始值,Swift 將會自動為你賦值
//使用整數(shù)作為原始值時完沪,隱式賦值的值依次遞增1
enum Planet:Int{
case number1 = 1,number2,number3,number
}
//當(dāng)使用字符串作為枚舉類型的原始值時域庇,每個枚舉成員的隱式原始值為該枚舉成員的名稱。使用枚舉成員的rawValue屬性可以訪問該枚舉成員的原始值
enum testPoint:String{
case North
case South
case East
case West
}
let planet1 = Planet.number.rawValue;
let test1 = testPoint.North.rawValue;
print("planet1 = \(planet1),test1 = \(test1)");//打印結(jié)果:planet1 = 4,test1 = North
//如果在定義枚舉類型的時候使用了原始值覆积,那么將會自動獲得一個初始化方法听皿,這個方法接收一個叫做rawValue的參數(shù),參數(shù)類型即為原始值類型宽档,返回值則是枚舉成員或nil尉姨。你可以使用這個初始化方法來創(chuàng)建一個新的枚舉實例
let possiblePlanet = Planet(rawValue: 3)
//possiblePlanet 類型為 Planet? 值為 Planet.number3,并非所有Int值都可以找到一個匹配的行星。因此吗冤,原始值構(gòu)造器總是返回一個可選的枚舉成員又厉。在上面的例子中九府,possiblePlanet是Planet?類型,或者說“可選的Planet”覆致。
print(possiblePlanet!)//打印結(jié)果:number3
//遞歸枚舉:遞歸枚舉(recursive enumeration)是一種枚舉類型侄旬,它有一個或多個枚舉成員使用該枚舉類型的實例作為關(guān)聯(lián)值。使用遞歸枚舉時煌妈,編譯器會插入一個間接層儡羔。你可以在枚舉成員前加上indirect來表示該成員可遞歸。
enum ArithmeticExpression{
case NUmber(Int)
indirect case Addition(ArithmeticExpression,ArithmeticExpression)
indirect case Mutiplication(ArithmeticExpression,ArithmeticExpression)
}
//你也可以在枚舉類型開頭加上indirect關(guān)鍵字來表明它的所有成員都是可遞歸的
indirect enum ArithmeticExpression1{
case NUmber(Int)
case Addition(ArithmeticExpression1,ArithmeticExpression1)
case Mutiplication(ArithmeticExpression1,ArithmeticExpression1)
}
//要操作具有遞歸性質(zhì)的數(shù)據(jù)結(jié)構(gòu)璧诵,使用遞歸函數(shù)是一種直截了當(dāng)?shù)姆绞? func evaluate(expression:ArithmeticExpression)-> Int{
switch expression {
case .NUmber(let value):
return value;
case .Addition(let left, let right):
return evaluate(left) + evaluate(right)
case .Mutiplication(let left , let right):
return evaluate(left)*evaluate(right)
}
}
//計算 (50+2)*10
let five = ArithmeticExpression.NUmber(50)
let four = ArithmeticExpression.NUmber(2)
let sum = ArithmeticExpression.Addition(five, four)
let product = ArithmeticExpression.Mutiplication(sum, ArithmeticExpression.NUmber(10))
print("(50+2)*10 = \(evaluate(product))")//打印結(jié)果:(50+2)*10 = 520
// Do any additional setup after loading the view, typically from a nib.
}
override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
// Dispose of any resources that can be recreated.
}
}