枚举
- 基本用法:
- 关联值:有时会将枚举的成员值跟其他类型的关联存储在一起,会非常有用
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 // 这个只占一个字节(设定了原始值的也只占1个字节,只有关联值才会存储进去) 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指令查看区别:断点处是输入 help frame variable -R 或者简写(fr v -R)查看 ```
网友评论