在介紹枚舉之前我們先了解一下Swift中 關(guān)于面向?qū)ο蟮念愋?/strong>
Swift中不僅提供了
面向過(guò)程
的編程支持,也提供了全面的面向?qū)ο?/code>的支持,與普通的面向?qū)ο蟮木幊陶Z(yǔ)言(只支持類)不同烹吵,Swift可以定義枚舉拯欧,結(jié)構(gòu)體详囤,類 3種面向?qū)ο蟮念愋停ɑ騭wift類型)、這三種類型镐作,都可以被認(rèn)為是一種該自定義的數(shù)據(jù)類型藏姐,可以被枚舉,結(jié)構(gòu)體该贾,類來(lái)定義變量羔杨,其中
枚舉
和結(jié)構(gòu)體
是值類型
,使用類
定義的變量則是引用類型
實(shí)例和對(duì)象的關(guān)系
在Swift中杨蛋,實(shí)例和對(duì)象是不同的兜材, 只有類的實(shí)例
才能成為對(duì)象
,而結(jié)構(gòu)體和枚舉
的實(shí)例
則只能稱為 實(shí)例
逞力,不能成為對(duì)象
在這三種程序單元的內(nèi)部曙寡,分別可以定義屬性(存儲(chǔ)屬性,計(jì)算屬性)寇荧、方法卵皂、構(gòu)造器、下標(biāo)砚亭、嵌套類型(包括嵌套類灯变、嵌套結(jié)構(gòu)體、嵌套枚舉)5中類型成員
現(xiàn)在進(jìn)入正題
1捅膘、枚舉的定義和特點(diǎn)
Swift中枚舉:是一種重新定義的類型:和所有的語(yǔ)言的功能類似
作用:主要用于管理一組有限的值的集合
特點(diǎn):
1.具有面向?qū)ο蟮奶卣?br> 2.支持計(jì)算屬性
3.支持實(shí)例方法和類型方法
4.允許枚舉遵守指定協(xié)議來(lái)提供標(biāo)準(zhǔn)的功能
格式:
enum 枚舉名 {
//使用case關(guān)鍵字列出所有的枚舉值
//枚舉的其他成員
}
//枚舉的定義
enum Season{
case Spring
case Summer
case Fall
case Winter
}
- 上面枚舉中定義了4個(gè)枚舉值添祸,每個(gè)枚舉值使用一個(gè)case定義
- 我們也可以使用一個(gè)case 定義多個(gè)枚舉值
enum Weekly {
//使用一個(gè)case列出多個(gè)枚舉值
case Monday,Tuesday,Wednesday,Thursday,Firday,Saturday,Sunday
}
2、枚舉的使用
與C寻仗、OC的枚舉不同刃泌,Swift的枚舉成員不會(huì)被分配一個(gè)默認(rèn)的整數(shù)值,
【重點(diǎn)】也就是說(shuō),Swift的枚舉名本身就代表一個(gè)枚舉實(shí)例耙替,對(duì)應(yīng)一個(gè)枚舉值亚侠,與整數(shù)值沒(méi)有任何關(guān)系,
定義了Swift的任意類型之后俗扇,大致可從如下幾個(gè)方面來(lái)使用該類型
1->聲明變量
2->創(chuàng)建實(shí)例
3->訪問(wèn)類型屬性
4->調(diào)用類型方法
5->派生子類硝烂。但Swift中 只有類才支持繼承,枚舉和結(jié)構(gòu)體都不支持繼承铜幽,因此枚舉和結(jié)構(gòu)體都不能派生子類
【注意】:這5中功能滞谢,是面向?qū)ο蟮目偩V,以后無(wú)論學(xué)習(xí)任何面向?qū)ο蟮木幊陶Z(yǔ)言的時(shí)候除抛,有了類之后狮杨,大致上都是使用上面列出的5種功能
//1->聲明
var day:Weekly
//2->創(chuàng)建實(shí)例
//使用已有的枚舉實(shí)例賦值(因?yàn)槊杜e名本身就代表一個(gè)枚舉實(shí)例,所以不需要?jiǎng)?chuàng)建實(shí)例)
day = Weekly.Firday
print(day)
- 在定義day的時(shí)候已經(jīng)知道了day的類型 所以在后面使用的時(shí)候 可以省略 前面的類型
day = .Firday
3到忽、枚舉和Switch語(yǔ)句
【注】因?yàn)镾witch語(yǔ)言中橄教,Switch語(yǔ)句 必須是
完備
的,也就是說(shuō)Switch語(yǔ)句的case必須覆蓋所有可能的情況,否則最后必須添加default語(yǔ)句
let chooseDay = Weekly.Monday
switch chooseDay {
case .Monday :
print("1")
case .Tuesday:
print("2")
case .Wednesday:
print("3")
case .Thursday :
print("4")
case .Firday:
print("5")
case .Saturday:
print("6")
case .Sunday:
print("7")
}
因?yàn)樯厦娉绦蛑械腸ase已經(jīng)覆蓋了 所有枚舉值喘漏,所以switch語(yǔ)句可以省略颤陶,default 分支,當(dāng)然也可以添加上:只是會(huì)報(bào)個(gè)警告
Default will never be executed
哦陷遮,對(duì)了 如果 你運(yùn)行的時(shí)候滓走,在switch chooseDay { 這行報(bào)警告Switch condition evaluates to a constant
的話,可以把要聲明的變量放到函數(shù)外
3帽馋、原始值
有點(diǎn)類似于搅方,C、OC的枚舉绽族,通過(guò)原始值可以為每個(gè)枚舉實(shí)例指定一個(gè)簡(jiǎn)單類型姨涡,如Int Double String等
語(yǔ)法:enum 枚舉名 : 原始值類型 {
case 枚舉值 = 原始值
}
- 【注】 Swift并不要對(duì)每個(gè)枚舉值都指定,原始值吧慢。
Swift可以根據(jù)已指定的原始值涛漂,推斷出它前后的所有枚舉值
- 原始值為:Int 類型
enum weekDay2 :Int {
case Monday=1,Tuesday,Wednesday=5,Thursday,Firday,Saturday,Sunday
}
//可以推斷,Tuesday的原始值為2 Thursday=6 Firday=7
原始值為:String類型
Swift也可以為 枚舉值分配隱式的原始值--隱式的原始值與變量名同名
這里程序只為L(zhǎng)eft 顯式分配了原始值检诗,意味著只有l(wèi)eft的原始值是“Left” 其余的原始值 都是隱式原始值匈仗,也就是“Up”,"Down","Right"
【注】枚舉要么完全不指定原始值,要么所有枚舉都具有原始值逢慌,為了讓所有的枚舉都有原始值悠轩,即可讓系統(tǒng)自動(dòng)推斷,也可指定顯示指定
enum Orientation :String {
case Up ,Down,Left="左",Right
}
現(xiàn)在已經(jīng)有了 原始值 攻泼,接下來(lái)即可使用枚舉提供的如下的構(gòu)造器和屬性
init?(rawValue:):可能失敗的構(gòu)造器:根據(jù)原始值返回對(duì)應(yīng)的枚舉值
hashValue:根據(jù)枚舉值 獲得原始值
let Orient = Orientation.Up
print("\\(Orient.hashValue)")//通過(guò)枚舉值-->原始值
//輸出Up
let MyOrient = Orientation(rawValue:"左") //原始值 --> 枚舉值
//因?yàn)閕nit?(rawValue:)是一個(gè) 可能失敗的構(gòu)造器 所以要執(zhí)行可選綁定
if let newOrient = MyOrient {
print(newOrient)
}
//輸出 Left
print("\\(Orient.hashValue)")//Orient.hashValue 獲取哈希值
//輸出 0
4火架、 關(guān)聯(lián)值
枚舉除了可以定義一組鉴象,枚舉成員之外,還可以為枚舉成員定義一組關(guān)聯(lián)值何鸡,--Swift并不要求各枚舉 具有相同的關(guān)聯(lián)值纺弊,關(guān)聯(lián)值就是枚舉實(shí)例攜帶的一些額外的數(shù)據(jù),有點(diǎn)類似于枚舉值的屬性骡男。
語(yǔ)法: 語(yǔ)法:case 枚舉值(元組語(yǔ)法)
enum Planet {
case Mercury (weight:Double ,density:Double,name:String)
case Venus (Double ,Double)
case Jupiter
}
//Mercury Venus攜帶關(guān)聯(lián)值淆游,而且Mercury的關(guān)聯(lián)值還指定了名稱,雖然指定了名稱但是洞翩,程序依然無(wú)法向訪問(wèn)元組成員一樣訪問(wèn)關(guān)聯(lián)值
var p1 = Planet.Mercury(weight: 10, density: 10, name: "lpx")
- 【注】:當(dāng)程序?yàn)槊杜e值 指定了 關(guān)聯(lián)值之后稽犁,程序使用這些枚舉值的時(shí)焰望,必須指定它的關(guān)聯(lián)值骚亿。
** 關(guān)聯(lián)值的訪問(wèn)**
- 枚舉中的關(guān)聯(lián)值:需要聲明額外的變量(常量),并將枚舉的關(guān)聯(lián)值綁定到這些變量或常量
//【注】如果程序打算將某個(gè)枚舉值的所有關(guān)聯(lián)值都提取為變量或常量熊赖,也可只將一個(gè)var来屠、let 放置在枚舉成員的前面。
//eg: case let .Mercury(weight, density, last ):
switch p1 {
//這里就相當(dāng)于 元組值的綁定
case Planet.Mercury(let weight , let density,let name ):
print("weight= \\(weight) density=\\(density) name=\\(last)")
default :
print("")
}
//輸出 weight= 10.0 density=10.0 name=lpx
5震鹉、枚舉的函數(shù)用法(【用的比較少】【而且沒(méi)有提示】)
對(duì)于有關(guān)聯(lián)值的枚舉俱笛,甚至可以被當(dāng)做函數(shù)使用,該函數(shù)總是可以根據(jù)關(guān)聯(lián)值創(chuàng)建對(duì)應(yīng)的枚舉實(shí)例传趾,與普通函數(shù)類似的是迎膜,可作為函數(shù)使用的枚舉,也可以被賦值給函數(shù)類型的變量浆兰,
let fn = Planet.Venus//將Planet.Venus賦給fn變量 得知fn是一個(gè)類型為(Double,Double)->Planet的函數(shù)
let g1 = fn(10,10)//返回的就是關(guān)聯(lián)值為 10磕仅,10的Venus的枚舉值與直接獲取的Planet.Venus(10, 10)的結(jié)果相同
print(g1)
let g2 = Planet.Venus(10, 10)
print(g2)//這兩個(gè)輸出的一樣的 Venus(10.0, 10.0)
6、遞歸枚舉
在有些情況下簸呈,枚舉值所包含的關(guān)聯(lián)值類型 又是該枚舉本身榕订,此時(shí)就形成了遞歸枚舉,
enum Weekly2 {
indirect case Monday (next:Weekly2)
case Tuesday (String)
case Wednesday
case Thursday
case Firday
indirect case Saturday(next:Weekly2)
case Sunday
}
- Swift也支持用 indirect 修飾枚舉本身蜕便,把indirect放到enum前面劫恒,這就相當(dāng)于 在每個(gè)枚舉值的case前都是用了indirect