可选项

作者: 24Kr | 来源:发表于2021-02-20 18:09 被阅读0次

    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<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
        }
      }
    

    相关文章

      网友评论

          本文标题:可选项

          本文链接:https://www.haomeiwen.com/subject/nhnaxltx.html