//枚舉定義安全
import UIKit函數
//枚舉定義 (枚舉、結構體、類的名字首字母必須大寫,表示爲定義了新的類型)code
/*枚舉爲一組相關的值定義了一個共同的類型,使你能夠在你的代碼中以類型安全的方式來使用這些值。枚舉成員能夠指定任意類型的關聯值存儲到枚舉成員中遞歸
枚舉類型是一等(first-class)類型。它們採用了不少在傳統上只被類(class)所支持的特性,例如計算型屬性(computed properties),用於提供枚舉值的附加信息,實例方法(instance methods),用於提供和枚舉值相關聯的功能。枚舉也能夠定義構造函數(initializers)來提供一個初始值;能夠在原始實現的基礎上擴展它們的功能;還能夠遵照協議(protocols)來提供標準的功能編譯器
遞歸(indirect)枚舉:遞歸枚舉(recursive enumeration)是一種枚舉類型(嵌套),它有一個或多個枚舉成員使用該枚舉類型的實例做爲關聯值。使用遞歸枚舉時,編譯器會插入一個間接層。你能夠在枚舉成員前加上indirect來表示該成員可遞歸it
*/io
enum Barcode {編譯
case UPCA(Int, Int, Int, Int)class
case QRCode(String)import
}
//定義一個名爲Barcode的枚舉類型,它的一個成員值是具備(Int,Int,Int,Int)類型關聯值的UPCA,另外一個成員值是具備String類型關聯值的QRCode。」
//這個定義不提供任何Int或String類型的關聯值,它只是定義了,當Barcode常量和變量等於Barcode.UPCA或Barcode.QRCode時,能夠存儲的關聯值的類型。
enum Planet{
case qiuti(String,String,String)
case canshu([Int],String)
}
let wt1 = Planet.qiuti("diqiu", "yueqiu", "taiyang")
let wt2 = Planet.canshu([1,2,3,4], "數據")
switch wt2{
case .qiuti(let a,let b,let c): //將值綁定給常量或變量
print("\(a)、\(b)、\(c)")
case let .canshu(array,str): //聲明關鍵字let、var可前置
print("\(array)、\(str)")
}
//=====================================================
enum Name:Int{
case menber1 = 1,menber2,menber3 //原始值的隱式賦值
case menber4,menber5
}
//枚舉成員原始值:rawValue,若爲Int枚舉其成員默認rawValue爲0,1,2...,若爲String則爲成員名字
var meijushili = Name.menber1
meijushili = .menber5
var c = meijushili.rawValue
print(c) //c = 5
var m = Name(rawValue: 2) //m = Name.menber2,返回的是可選的枚舉類型,原始值構造器是一個可失敗構造器
print(m)
//======================================================
//枚舉類型應用:計算表達式的值,如: (3+5)*(11-9)
indirect enum Jisuan { //外置indirect 關鍵字表示該枚舉的全部成員都可遞歸(嵌套),內置則指定某成員可遞歸
case number(Int)
case jiafa(Jisuan,Jisuan)
case jianfa(Jisuan,Jisuan)
case chengfa(Jisuan,Jisuan)
case chufa(Jisuan,Jisuan)
}
func kaishi(suanfa:Jisuan)->Int{
switch suanfa{
case .number(let a):
return a
case .jiafa(let left, let right):
return kaishi(left) + kaishi(right)
case .jianfa(let left, let right):
return kaishi(left) - kaishi(right)
case .chengfa(let left, let right):
return kaishi(left) * kaishi(right)
case .chufa(let left, let right):
return kaishi(left) / kaishi(right)
}
}
//var a = Jisuan.number(15)
var sumjiafa = Jisuan.jiafa(.number(3), .number(5)) //3+5
var sumjianfa = Jisuan.jianfa(.number(11), .number(9)) //11-9
var sumchengfa = Jisuan.chengfa(sumjiafa, sumjianfa) //(3+5)*(11-9) = 16
var sumchufa = Jisuan.chufa(sumchengfa, sumjiafa) //(3+5)*(11-9)/(3+5) = 2
var sum1 = kaishi(sumchengfa)
var sum2 = kaishi(sumchufa)
print(sum1)
print(sum2)