可选项

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("解包失败")
}
  1. 可选项绑定:使用可选项绑定,判断可选项是否包含值如果包含,就自动解包把值赋值给临时变量或者常量,并且返回 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>) mc2 = some {
  some = none {
    some = {
      _value = 0
    }
  }
}

查看mc3的结构

frame variable -R mc3
(Swift.Optional>) mc3 = none {
  some = some {
    some = {
      _value = 0
    }
  }
}

可以看出mc3 = none,mc3是一个空盒子。

some = none代表值为nil的空盒子
some = none {
    some = {
      _value = 0
    }
  }

你可能感兴趣的:(可选项)