更新: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
