枚舉
- 基本用法:
- 關聯值:有時會將枚舉的成員值跟其他類型的關聯存儲在一起老翘,會非常有用
enum Score {
case points(Int)
case grade(Character)
}
var score = Score.points(96)
score = .grade(“A”)
switch score {
case let .points(i):
print(i, “points”)
case let .grade(i):
print(“grade”,i)
}
-
原始值:枚舉成員可以使用相同類型的默認值預先關聯
enum PokerSuit : Character { case spade = “黑桃” case heart = “紅心” case club =.“梅花” case diamond = “紅鉆” } print(PokerSuit.spade.rawValue) // 隱式原始值:如果枚舉的原始值類型是Int、String類型冲簿,swift會自動分配原始值涣旨;String類型按照定義名稱設置為原始值氏仗;Int類型和c語音設置一樣
-
遞歸枚舉
indirect enum ArithExpr{ case number(Int) case sum(ArithExpr, ArithExpr) case difference(ArithExpr,ArithExpr) } let five = ArithExpr.number(5) let four = ArithExpr.number(4) let two = ArithExpr.number(2) let sum = ArithExpr.sum(five, four) let difference = ArithExpr.difference(sum, two)
-
MemoryLayout :獲取數據類型占用內存大小
var age = 10 MemoryLayout.size(ofValue: age) // 分配占用的空間大小 MemoryLayout<Int>.size // 分配占用的空間大小 MemoryLayout<Int>stride // 內存對齊 MemoryLayout<Int>.alignment // 這個只占一個字節(jié)(設定了原始值的也只占1個字節(jié),只有關聯值才會存儲進去) enum season {case spring,summer,autumn,winter}
可選項
-
定義:又稱可選類型我碟,允許定義的數據返回nil(意思就是原本所有的數據類型都不能設置為nil)放案,只需要在定義類型后面補充個 (?)即可矫俺,可選項類型默認有初始值nil
EX1: var name :String? = “Jack” name = nil EX2: var array = [10,20,30,40] func get(_ index:Int) ->Int? { if (index < 0 || index >= array.count) { return nil } return array[index] }
強制解包:
1吱殉、可選值本質是對其他類型的一個包裝掸冤,可以將它理解為一個盒子。
2友雳、如果是nil代表的是一個空盒子稿湿,如果不是nil盒子內裝的就是被包裝的數據類型。
3押赊、如果要從可選項中取出被包裝的數據饺藤,則需要在可選項后使用“!”進行強制解包。
4流礁、這個過程不會改變原本的可選值涕俗,只是拿出里面包裝的類型使用
5、對nil(空盒子)進行強制解包崇棠,運行時會報錯
-
可選項綁定:
1咽袜、可以判斷可選項是否有值
2、如果包含則自動解包賦值給let 或者 var并返回true枕稀,否則返回false
3、while也可以使用if let number = Int(“123”) { print(\(number)) // 結果是123谜嫉,并非Optional(123) }else { xxx } // 可選項綁定判斷不能用&& 萎坷,需要用逗號(,) if let first = Int(“10”), let second = Int(“20”), (first < second && second < 100) { xxx }
-
空合并運算符(??)
a ?? b
條件說明:
1沐兰、a一定是可選項哆档,b不一定是可選項
2、a如果不是空盒子(nil)則返回a住闯,否則返回b
3瓜浸、如果b不是可選項,返回a的時候比原,會自動解包
4插佛、b和a的類型需要相同,如果b不是可選值量窘,則要和a解包后的格式相同
5雇寇、多個運算符,數據類型只看最后一個數值蚌铜,再從左到右運算
6锨侯、補充:字典根據key取出來的數據是可選類型;數組根據下標取出數據是真實數據類型冬殃,因此數組需要做防止越界處理// ??與if let同用 let a :Int? = nil let b :Int? = 2 if let c = a ?? b { // 類似if a!=nil || b != nil } let a :Int? = nil let b :Int? = 2 if let c = a , let d = b { // 類似if a!=nil && b != nil }
guard語句
說明:
1囚痴、當條件為false進入guard條件語句,否則跳過审葬。
2深滚、適合用于提前退出
3骂束、使用guard可選項綁定的時候,綁定的數值可用于判斷語句外部
guard 條件 else { // 一定要退出當前作用域:reutrn,break,continue,throw error } // 可用于判斷登陸用戶名以及密碼模塊
-
隱式解包
說明:
1成箫、某些情況下展箱,可選項一旦被設定值后,就確定一定有值蹬昌;
2混驰、如果確定有值,我們去掉對該值的檢查皂贩,也不必每次都強制解包
3栖榨、使用場景主要是確定對方傳給我們值,如果是nil不做處理
```
// num1本質還是可選項類型
let num1:Int! = 10
let num2 :Int = num1// ps:可選項是空值使用解包還是會報錯 let num1: Int! = nil let num2:Int = num1 ```
字符串插值
var age :Int? = 10 print(“my age is \(age)”) // 這種寫法是會有?的 // 消除?的三種方法 // ?:解包:my age is 10 print(“my age is \(age!)”) // ?:將字符描述打印出來:my age is optional(10) print(“my age is \(String(describing: age))”) // ?:空合并運算符:my age is 10 print(“my age is \(age??0)”)
-
多重可選項
```
// ?
let num1 :Int? = 10
let num2 :Int?? = num1
let num3 :Int?? = 10
// 解釋:num2 == num3 都是包了兩層的optional// ? let num1 :Int? = nil let num2 :Int?? = num1 let num3 :Int?? = nil // 解釋:num2 明刷!= num3 num3實際是只包了一層的nil // ??可以使用lldb指令查看區(qū)別:斷點處是輸入 help frame variable -R 或者簡寫(fr v -R)查看 ```