美文网首页
Swift 可选类型

Swift 可选类型

作者: 小强七号 | 来源:发表于2019-07-16 23:47 被阅读0次

    Switf的可选类型(optional)类型,用于处理值缺失的情况。可选表示”那儿有一个值,并且它等于 x 或者 “那儿没有值”。Swift语言定义后缀 ?作为命名可选类型的简写,以下两种声明是可等的:

    var optionalInteger: Int ?
    var optionalInteger: Optional<Int>
    

    在这两种情况下,变量optionalInteger都是可选类型。注意,在类型和?之间没有空格。Optional是一个包含两种情况的枚举,Nonesome(T),用来表示可能有或者可能没有值。任何类型都可以明确声明为(或者隐式转换)可选类型。当声明一个可选类型的时候。要确保用括号给 ? 操作符一个合适的范围。例如,声明可选整数数组,应该写成 (Int[])?,写成 Int[]? 会报错。当你声明一个可选变量或者可选属性的时候没有提供初始值,它的值默认为 nil。可选项遵照LogicValue协议,因此可以出现在布尔环境中。在这种情况下,如果可选类型为 T?包含类型为T的任何值(也就是说它的值时 Optional.Some(T)),这个可选类型等于 true,反之为false.如果一个可选类型的实例包含一个值,你可以用后缀操作符!来访问这个值,如下所示:

    optionalInteger = 42
    optionalInteger ! // 42
    

    使用操作符 !去获取值为nil的可选变量会有运行错误。你可以用可选链接和可选绑定选择性执行可选表达式操作。如果值为nil,任何操作都不行,也不会有运行报错。

    var myString:String?
    myString = "hello world"
    if myString != nil {            
          print(myString!)
        } else {
            print("字符串为 nil")
        }
    

    以上结果为:

    hello world
    

    可选类型类似于OC中的指针的nil值,但nil只对类(calss)有用,而对可选类型对所有的类型都可用,并且更安全。

    强制解析

    当你确定可选类型确实包含值之后,你可以在可选的名字后面加一个感叹(!)来获取值,这个感叹号表示"我知道这个可选有值,请使用它。"这被称为可选值的强制解析(forced unwrapping)

      var myString:String?
     
      myString = "hello swift"
         
      if myString != nil {
             print(myString)
        } else {
             print("myString 值为 nil")
         }
    

    执行结果为

    Optional("hello swift")
    

    强制解析可选值,使用感叹号(!):

    var myString:String?
         
     myString = "hello swift"
            
    if myString != nil {            
        print(myString!)
    } else {
         print("myString 值为 nil")   
    }
    

    输出结果为:

    hello swift
    

    注意:使用 ! 来获取一个不存在的可选值会导致运行时错误。使用 ! 来强制解析值之前,一定要确定可选包含一个非nil的值。

    可选绑定

    使用optional binding来判断optional类型是否有值,并且如果有值就把值赋给一个常量或者临时变量。
    optional binding可以用在 if 和 while 语句中:

    if let constantName = someOptional {
         print("get the value: \(constantName)")
    }
    
    
    //如果someOptional这个optional类型有值,创建一个叫做constantName的常量并将someOptional包含的值赋给它。
    //并且因为constantName已经被optional类型包含的值初始化过,所以不需要再使用 ! 后缀来获取它的值。
    
    
    var myString:String?
    myString = "hello swift!"
    
    if let yourString = myString {
        print("你的字符串是:\(yourString)")
    } else {
        print("你的字符串没有值")
    }
    

    相关文章

      网友评论

          本文标题:Swift 可选类型

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