更新:2018.05.24
整理了一下demo:SwiftDemo
好久沒弄了似将,最近一直在找房子遵堵,搬家念脯,軟裝触徐,累瘋了摹菠。
枚舉
- 枚舉在OC中已經(jīng)很常見了囊扳,所謂枚舉尿贫,是中將變量的值一一列舉出來往毡,并只限于在列舉出來的值的范圍內(nèi)進行取值个少。
- 在Swift中洪乍,枚舉更加常見,并且不需給枚舉中的每個成員都提供值夜焦。
- Swift中壳澳,枚舉可以支持字典、字符茫经、整數(shù)和浮點類型巷波。作為枚舉成員的數(shù)據(jù)類型萎津。
定義
枚舉的定義需要好enum
關(guān)鍵字,枚舉的成員則被放置在一對大括號中抹镊。
enum 枚舉名稱 {
// 此處放置枚舉的成員
}
當我們要定義一個用戶等級系統(tǒng)時~~
enum UserLevel {
case 總經(jīng)理
case 區(qū)域經(jīng)理
case 主管
case 業(yè)務(wù)員
}
在UserLevel
枚舉中定義的值:總經(jīng)理锉屈、區(qū)域經(jīng)理、主管垮耳、業(yè)務(wù)員颈渊。就會枚舉的成員值或成員,通過case
關(guān)鍵字明確要定義的成員终佛。
在定義枚舉時俊嗽,如果枚舉成員較少,也可以將枚舉成員放置在一行之后中铃彰。
例如:
enum UserLevel {
case 總經(jīng)理,區(qū)域經(jīng)理,主管,業(yè)務(wù)員
}
這兩種方式都可以完枚舉定義
和OC不同的是:
- Swift的枚舉成員在被創(chuàng)建時绍豁,不會被賦予一個默認的整數(shù)值,例如在上面的例子中豌研,總經(jīng)理妹田、區(qū)域經(jīng)理、主管鹃共、業(yè)務(wù)員鬼佣,他們的值并不會等于 0、1霜浴、2晶衷、3。
- 當你定義一個枚舉類型的變量或者常量時阴孟,在輸入枚舉名稱和
.
之后晌纫,系統(tǒng)會自動彈出枚舉列表。
遍歷枚舉
通常使用switch
語句進行枚舉的遍歷操作:
switch userLevel {
case UserLevel.業(yè)務(wù)員:
print("業(yè)務(wù)員登錄形同")
case UserLevel.主管:
print("主管登錄系統(tǒng)")
case UserLevel.區(qū)域經(jīng)理:
print("區(qū)域經(jīng)理登錄系統(tǒng)")
default:
print("大bose登錄系統(tǒng)")
}
枚舉的原始值
枚舉成員可以使用相同類型的默認值永丝,這些默認值就是枚舉的原始值
enum Gender : UInt8 {
case Male = 1
case Female = 2
case Unknow = 3
}
可以看出锹漱,我們定義了一個Gender
的枚舉,其原始值類型為UInt8
慕嚷,美劇的三個成員的值是1哥牍,2,3喝检。
也可以這樣寫:
enum Gender : UInt8 {
case Male = 1, Female,Unknow
}
在上面的例子中嗅辣,Gender.Make = 1,它有明確的原始值挠说,則Gender.Female的隱式原始值是2澡谭,以此類推。
給枚舉添加方法
swift中的枚舉可以添加方法
enum Gender : UInt8 {
case Male,Female,UnKnow
func description() {
switch self {
case.Male:
print("Hi,Man~")
case.Female:
print("Hi,lady~")
case.UnKnow:
print("Hi~")
}
}
}
let gender = Gender.Female
gender.description()
在上面的例子中损俭,為Gender
枚舉添加了一個 description
的方法蛙奖,在這個方法中潘酗,通過switch遍歷枚舉并輸出。
結(jié)構(gòu)體
- 在Swfit開發(fā)環(huán)境中外永,結(jié)構(gòu)體是構(gòu)建代碼所用的一種通用且靈活的結(jié)構(gòu)體崎脉。
- Swfit中,把一些基本數(shù)據(jù)類型伯顶,string囚灼,array,dictionary等全部變成了結(jié)構(gòu)體祭衩,更方便我們使用灶体。
- 可以為結(jié)構(gòu)體定義變量或常量的屬性,甚至可以像枚舉一樣掐暮,給結(jié)構(gòu)體添加方法蝎抽。
定義
結(jié)構(gòu)體的定義格式和枚舉相似,是以struct
關(guān)鍵字來進行定義的路克。
struct 結(jié)構(gòu)體名稱 {
// 此處為結(jié)構(gòu)體內(nèi)容
}
舉例將動物園作為一個結(jié)構(gòu)體:
struct Animal {
let zooName:String = "Beijing Zoo"
var name:String
}
上面例子中樟结,使用struct
關(guān)鍵字定義了一個結(jié)構(gòu)體,由于動物園的名字是固定的精算,所以給zooName
定義一個常量的值瓢宦,每個動物園的動物有很多種,所以給名字一個變量的值灰羽。
對于結(jié)構(gòu)體的實例化驮履,可以這樣:
let animal = Animal(name:"Tiger")
輸出animal
中的name
屬性:
print(animal.name) // 輸出結(jié)果為:Tiger
還可以修改實例的name
屬性:
var animal = Animal(name:"Tiger")
animal.name = "Elephant"
print(animal.name) // 輸出結(jié)果為:Elephant
需要注意的是:類是引用類型,而結(jié)構(gòu)體和枚舉都是值類型廉嚼。值類型是一種當它被指定為常量或變量玫镐,或被傳遞給函數(shù)時會拷貝的類型。這意味著你所創(chuàng)建的任意結(jié)構(gòu)體和枚舉實力怠噪,作為屬性所包含的任何類型恐似,在代碼傳遞中總是被拷貝的。
如例:
let firstAnimal = Animal(name:"Tiger")
var secondAnimal = firstAnimal
secondAnimal.name = "Elephant"
print(firstAnimal) // 輸出結(jié)果:Tiger
print(secondAnimal) // 輸出結(jié)果: Elephant
上例中傍念,創(chuàng)建了一個Animal
結(jié)構(gòu)體的實體矫夷,并初始化name
屬性為Tiger
。
然后將firstAnimal
實例賦予secondAnimal
變量捂寿。當firstAnimal
被賦予給secondAnimal
變量時口四,firstAnima
的值就被拷貝了一份孵运。并將拷貝的實例賦予給secondAnimal
秦陋,這樣就產(chǎn)生了兩個不同的實例。所以當secondAnimal
的name
屬性修改時治笨,firstAnimal
的name
不會變化驳概。
給結(jié)構(gòu)體添加方法
和枚舉的方法類似
struct Animal {
let zooName:String = "Beijing Zoo"
var name:String
func say() {
print("Hi,\(name)!")
}
}
let animal = Animal(name:"Tiger")
print(animal.say()) // Hi,Tiger!
結(jié)構(gòu)體的下標
- 結(jié)構(gòu)體赤嚼、類和枚舉都可以定義下標,它可以作為訪問集合顺又、列表或序列成員元素的快捷方式更卒。
- 可以使用下標通過索引值來設(shè)置或檢索值,而不需要設(shè)置和檢索分別使用實例方法稚照。
- 結(jié)構(gòu)體可以定義多個下標蹂空,并且下標會基于傳入的索引值的類型,選擇合適的下標重載使用果录。
- 下標的語法類似乎實例方法和計算屬性上枕。使用關(guān)鍵字
subscript
來定義下標,并指定一個或多個輸入形式參數(shù)和返回參數(shù)弱恒,與實例方法一樣辨萍。
例:
struct MySubscript {
var num:Int
subscript(n:Int) ->Int {
return num*n
}
}
上例中,定義了一個名為MySubscript
的結(jié)構(gòu)體返弹,它擁有一個名為num
的整形屬性锈玉。
在下面的代碼中,使用subscript
定義一個下標义起,通過傳入一個整形參數(shù)拉背,將結(jié)構(gòu)體的屬性乘以若干倍。
使用方法如下:
let sub = MySubscript(num:3)
print(sub[3]) // 輸出結(jié)果:9