美文网首页
Swift中的Optional

Swift中的Optional

作者: 盖小聂 | 来源:发表于2019-06-29 10:24 被阅读0次

    1、隐式解包Optional
    2、Optional Chaining
    3、多重Optional
    4、Optional Map
    5、JSON

    1、隐式解包Optional
    • 在声明的时候,我们可以通过在类型后加上一个感叹号(!)这个语法糖来告诉编译器我们需要一个可以隐式解包的Optional值:
    var maybeObject: MyClass!
    
    • 首先需要明确的是,隐式解包的Optional本质上与普通的Optional值并没有任何不同,只是我们在对这类变量的成员或方法进行访问的时候,编译器会自动为我们在后面插入解包符号!。隐式解包不意味着“这个变量不会是nil,你可以放心使用”这种暗示,只能说Swift通过这个特性给了我们一种简便但是危险的使用方式罢了。
    • 现在比较常见的隐式解包的Optional就只有使用Interface Builder时建立的IBoutlet了:
    @IBOutlet weak var button: UIButton!
    
    • 在我们的代码的其他部分,还是少用这样的隐式解包的Optional为好,很多时候多写一个Optional Binding就可以避免掉不少应用奔溃的风险。
    2、Optional Chaining
    • 使用Optional Chaining所得到的东西其实都是Optional的
    //toyName的类型为String?,这是由于在Optional Chaining中我们在任意一个?.的时候都可能遇到nil而提前返回,
    //这个时候当然就只能拿到nil了
    let toyName = xiaoming.pet?.toy?.name 
    
    • 使用Optional Binding来直接取值:
    if let toyName = xiaoming.pet?.toy?.name {    
      //太好了,小明既有宠物,而且宠物还正好有个玩具
    }
    
    3、多重Optional
    • 很多读者应该已经知道,我们使用的类型后加上?的语法只不过是Optional类型的语法糖,而实际上这个类型是一个enum。
    var aNil: String? = nil
    var anotherNil: String?? = aNil
    var literalNil: String?? = nil
    
    • anotherNil和literalNil是不等效的。anotherNil是盒子中包了一个盒子,打开内存的盒子的时候我们会发现空气;但是literalNil是盒子中直接是空气。
    if let a = anotherNil {    
      print(“anotherNil”)
    }
    if let b = literalNil {    
      print(“literalNil)
    }
    

    这样的代码只能输出anotherNil

    4、Optional Map
    • 我们经常会对Array类型使用map方法,这个方法能对数组中的所有元素应用某个规则,然后返回一个新的数组。
    let arr = [1,2,3]
    let doubled = arr.map {    
      $0 * 2
    }
    
    • 不仅在Array或者说CollectionType里可以用map,如果我们仔细看过Optional的声明的话,会发现它也有一个map方法。
    let num: Int? = 3
    let result = num.map {    
      $0 * 2
    }
    
    5、JSON
    • 因为Swift对于类型的要求非常严格,所以在解析完JSON之后想要从结果的AnyObject中获取某个键值是一件非常麻烦的事情。如果我们能够重载下标的话,就可以通过下标的取值配合Array和Dictionary的Optional Binding来简单的在JSON中取值。json-swift和SwiftyJSON这样的项目,使用了重载下标访问的方式简化了JSON操作。
    if let value = JSON(json)[“menu”][“popup”][“menuitem”][0][“value”].string {    
      print(value)
    } //json is a AnyObject from JSONObjectWithData
    

    相关文章

      网友评论

          本文标题:Swift中的Optional

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