swift 可选项 optional

306 阅读2分钟

1、可选项 optional 可以赋值为nil,其他类型不能赋值为nil,空合并运算符 ??,a ?? b 返回值的类型

// MARK: 可选项 optional 可以赋值为nil,其他类型不能赋值为nil,空合并运算符 ??,a ?? b 返回值的类型
    func testOptional() {
        var name: String? = "jack"
        name = nil
        
        // 强制解包 对值为nil的可选项强制解包,会产生运行时错误(崩溃)
        let age: Int? = 10
        print(age!)
        
        if name == nil {
            print("name is nil")
        } else {
            print(name!)
        }
        
        let num = Int("123") // num为optional类型
        if num != nil {
            print("字符串转整数成功:\(num!)")
        } else {
            print("转换失败")
        }
        
        // 自动解包 可选项自动解包的作用域只限于大括号内
        if let number = Int("123") {
            // 此时number已经自动解包为int类型而不是optional类型
            print("字符串转整数成功:\(number)")
        }
        
        // 可选项 optional同事满足多个条件不能使用&,而要使用逗号,连接
        if let first = Int("4"),
           let second = Int("42"){
            print("success")
        }
        
        // 空合并运算符 ??
        // a ?? b 返回值的类型跟b类型一致
        // 如果a不为nil,就返回a, 并且如果b不是可选项时,返回a时会自动解包
        // 如果a为nil,就返回b
        // a 是可选项, b 可选项 或 不是可选项 均可
        // b与a的存储类型必须相同
        let a: Int? = 1
        let b: Int? = 2
        let c = a ?? b
        print("c=\(String(describing: c))")
        
        let e: Int? = 3
        let f: Int = 4
        let g = e ?? f
        print("g=\(g)")
    }
 // MARK: 可选项 隐式解包
 // 隐式解包的可选项 num1为可选项 !为隐式解包,当为nil时不能使用!隐式解包
 // lldb 指令 frame variable -R 或者 fr v -R 查看变量的内存布局
 func hiddenOptional() {
     let num1: Int! = 10
     let num2: Int = num1
     print(num1 ?? 0,num2)
 }
  • 可选项与switch
var age: Int? = 10

switch age {
// ? 在此相当于解包
case let v?:
 	print(v)
   case nil:
     print("2")
}
等价于:
if let v = age {
	print(v)
} else {
	print("2")
}