可选项
2021-02-20 本文已影响0人
24Kr
1.定义:也就是可选类型,允许将值设置为nil。
在类型名称后面加个问号?来定义可选类型
var name :String? = "Lu"
name = nil
var age : Int?//默认就是nil
age = 10
age = nil
可选项是对其他类型的一层包装,可以将她理解为一个盒子
image.png
如果是nil,则是一个空盒子,
image.png
不为nil则,盒子里面装的是被包装类型的数据
如果要获取可选项的数据,就要对可选项进行拆包,就是强制解包。使用!进行强制解包
var age2:Int? = 10
let age3 = age2! + 1
var test:Int? = 1
let test2 = test!
如果对值为nil的空盒子进行解包,那么会产生运行时的错误(Unexpectedly found nil while unwrapping an Optional value:)
2.判断可选项是否包含值
let aa = Int("123");
if (aa != nil) {
print("解包成功:\(aa ?? 0)")
} else {
print("解包失败")
}
- 可选项绑定:使用可选项绑定,判断可选项是否包含值如果包含,就自动解包把值赋值给临时变量或者常量,并且返回 true或者false
if let number = Int("456") {
/// number是强制解包后的int值
print(number)
}
enum Season : Int {
case winter,summer,spring,autumn
}
if let suitSeason = Season(rawValue: 2) {
switch suitSeason {
case .winter:
print("winter")
case .summer:
print("summer")
case .spring:
print("spring")
case .autumn:
print("autumn")
}
} else {
print("没有合适季节")
}
2.1 三重条件判断
if let age3 = Int("55"),
let age4 = Int("44"),
age3 < age4 && age4 > 40 {
}
3.空合并运算
a ?? b a是可选项;b是可选或非可选;b和a的存储类型相同; a不为nil,返回a;a为nil,则返回b; b是不可选选项,则a自动解包
let cc : Int? = 10
let bb : Int? = 20
let dd = cc ?? bb
print(dd as Any)
let temp2 : Int? = nil
let temp3 : Int? = 9
let temp41 = temp2 ?? temp3
if let temp4 = temp2 ?? temp3 {/// temp4是解包后的值9
print(temp4)
}
4.guard语句:
guard条件定义的变量或者常量,外层区域也可以使用.条件不成立才执行里面的代码。与 continue break return等一起用,退出流程
func login(_ info:[String : String] ) -> Void {
guard let name = info["userName"] else {
print("请输入用户名")
return
}
guard let pwd = info["password"] else {
print("请输入密码")
return
}
print("用户名:\(name),密码:\(pwd)")
}
5.隐式解包
在类型后面加个感叹号!就是隐私解包。适用于:1.确保一定有值 2.为了快速访问,不用每次都解包
let temp5 : Int! = 5
let temp6 : Int = temp5
if temp5 != nil {
print("隐式解包:\(temp6+8)")
}
对可选项为空值进行解包,会发生运行时错
let num1 :Int! = nil
let num2 :Int = num1
6.多重可选项
6.1空盒子的辨别
var kg : Int? = 10
var kg2 : Int?? = kg
var kg3 : Int?? = 10
print(kg2 == kg3) //true
image.png
6.2空盒子的辨别
var mc : Int? = nil
var mc2 : Int?? = mc
var mc3 : Int?? = nil
print(mc2 == mc3) /// false
image.png
6.3 lldb命令frame variable -r查看变量的类型
查看mc2的结构
frame variable -R mc2
(Swift.Optional<Swift.Optional<Swift.Int>>) mc2 = some {
some = none {
some = {
_value = 0
}
}
}
查看mc3的结构
frame variable -R mc3
(Swift.Optional<Swift.Optional<Swift.Int>>) mc3 = none {
some = some {
some = {
_value = 0
}
}
}
可以看出mc3 = none,mc3是一个空盒子。
some = none代表值为nil的空盒子
some = none {
some = {
_value = 0
}
}