美文网首页
Optional Chaining

Optional Chaining

作者: wangwenju | 来源:发表于2017-07-03 23:18 被阅读0次

使用 Optional Chaining 可以让我们摆脱很多不必要的判断和取值,但是在使用的时候需要小心陷阱。

因为 Optional Chaining 是随时都可能提前返回 nil 的,所以使用 Optional Chaining 所得到的东西其实都是 Optional 的。比如有下面的一段代码:

class Toy {
    let name: String
    init(name: String) {
        self.name = name
    }
}

class Pet {
    var toy: Toy?
}

class Child {
    var pet: Pet?
}

在实际使用中,我们想要知道小明的宠物的玩具的名字的时候,可以通过下面的 Optional Chaining 拿到:

let toyName = xiaoming.pet?.toy?.name

注意虽然我们最后访问的是 name,并且在 Toy 的定义中 name 是被定义为一个确定的 String 而非 String? 的,但是我们拿到的 toyName 其实还是一个 String? 的类型。这是由于在 Optional Chaining 中我们在任意一个 ?. 的时候都可能遇到 nil 而提前返回,这个时候当然就只能拿到 nil 了。

在实际的使用中,我们大多数情况下可能更希望使用 Optional Binding 来直接取值的这样的代码:

if let toyName = xiaoming.pet?.toy?.name {
    // 太好了,小明既有宠物,而且宠物还正好有个玩具
}

可能单独拿出来看会很清楚,但是只要稍微和其他特性结合一下,事情就会变得复杂起来。来看看下面的例子:

extension Toy {
    func play() {
        //...
    }
}

我们为 Toy 定义了一个扩展,以及一个玩玩具的 play() 方法。还是拿小明举例子,要是有玩具的话,就玩之:

xiaoming.pet?.toy?.play()

除了小明也许我们还有小红小李小张等等..在这种时候我们会想要把这一串调用抽象出来,做一个闭包方便使用。传入一个 Child 对象,如果小朋友有宠物并且宠物有玩具的话,就去玩。于是很可能你会写出这样的代码:

这是错误代码

let playClosure = {(child: Child) -> () in child.pet?.toy?.play()}

这样的代码是没有意义的!

问题在于对于 play() 的调用上。定义的时候我们没有写 play() 的返回,这表示这个方法返回 Void (或者写作一对小括号 (),它们是等价的)。但是正如上所说,经过 Optional Chaining 以后我们得到的是一个 Optional 的结果。也就是说,我们最后得到的应该是这样一个 closure:

let playClosure = {(child: Child) -> ()? in child.pet?.toy?.play()}

这样调用的返回将是一个 ()? (或者写成 Void? 会更清楚一些),虽然看起来挺奇怪的,但这就是事实。使用的时候我们可以通过 Optional Binding 来判定方法是否调用成功:

if let result: () = playClosure(xiaoming) {
    print("好开心~")
} else {
    print("没有玩具可以玩 :(")
}

相关文章

  • Swift - 可选型操作

    Optional Chaining 与 Nil Coalesce 操作 optional chaining 对象?...

  • ES新特性

    optional chaining 本质:语法糖 年份:2020 optional chaining 可选链。主要...

  • 11-可选链

    可选链(Optional Chaining)

  • Swift中的Optional

    1、隐式解包Optional2、Optional Chaining3、多重Optional4、Optional M...

  • Optional Chaining

    Calling Methods Through Optional Chaining In the example ...

  • Optional Chaining

    Optional Chaining自判断链,可以用来判断调用的目标属性、方法、附属脚本等是否为空。不为空为成功,为...

  • Optional Chaining

    使用 Optional Chaining 可以让我们摆脱很多不必要的判断和取值,但是在使用的时候需要小心陷阱。 因...

  • swift入门16 可选择链

    Optional chaining is a process for querying and calling p...

  • es2020可选链语法与合并空语法babel

    npm install @babel/plugin-proposal-optional-chaining ...

  • Swift - Optional Chaining

    Swift 的可选绑定类似于 OC 中的消息为 nil,但是运用于所有类型,能够被检测成功或失败 Query & ...

网友评论

      本文标题:Optional Chaining

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