我对这个的理解就是:我们有可能会用到其他的属性或者方法,当我们在使用其他的时候,可以使用点语法去访问另一个的属性,这样的使用,就形成了链式访问。

  可空链式调用是一种可以请求和调用属性、方法及下表的过程,它的可空性体现于请求调用的目标当前可能为空(nil)。如果可空的目标有值,那么调用就会成功;如果选择的目标为空nil,那么这个调用将返回空。多个连续的调用可以被链接在一起形成一个调用链,如果其中任何一个节点为空nil将导致整个链调用失败。

  Attention:Swift的可空链式调用和OC中的消息为空有些相像,但是Swift可以使用在任意类型中,并且能够检查调用是否为空。

  ------如何定义为可空链呢?

  在属性、方法、下表的可空值后面放一个问号,可以定义一个可空链。这一点很像在可空值后面放一个叹号!来强制展开其中值。他们的区别是,当可空值为空时,可空链式只是调用失败,然而强制展开将会触发运行时错误。

  如果调用一个空对象的任何属性,将返回可空值,无论它的属性是不是可空值。可以通过返回值来判断你的可空链式调用是否调用成功,如果有返回值,则调用成功;如果返回nil则调用失败。

  Expecially:可空链式调用的返回结果与原本的返回结果具有相同的类型,但是被包装成了一个可空类型值。当可空链式调用成功时,一个本应该返回Int的类型的结果将会返回Int?类型。

  可空类型长什么样子呢?示例如下:

  1. class Person {
  2. var residence :Residence? //这个问号表明了residence是一个可空的属性,它的类型为Residence?
    }

  如果新建一个Person实例,因为它的residence属性是可空的,john的属性将初始化为nil。

  1. let john = Person()
  2. let roomCount = john.residence!.numberOfRooms
  3. 报错信息:fatal error: unexpectedly found nil while unwrapping an Optional value

  当使用叹号!强制展开获得这个john的residence属性中的numberOfRooms值,会触发运行时错误,因为没有可以展开的residence。。

  

  1. class Person {
  2. var residence :Residence?
  3. }
  4.  
  5. class Residence {
  6. var numberOfRooms = 1
  7. }
  8.  
  9. let john = Person()
  10. let res:Residence = Residence()
  11. let roomCount = john.residence?.numberOfRooms
  12. print(roomCount)

  print:nil

  因为访问numberOfRooms有可能失败,可空链式调用会返回Int?类型,或者称为“可空的Int”。当实例为nil,将返回nil。

  当给person的residence赋值后,就可以用返回值了:

  1. let john = Person()
  2. john.residence = Residence()
  3. let roomCount = john.residence?.numberOfRooms
  4. print(roomCount)
  5.  
  6. 打印结果:Optional(1)

  ****为可空链式调用定义模型类

  通过使用可空链式调用可以调用多层属性,方法,和下标。这样就可以通过各种模型向下访问各种子属性,并且判断能否访问子属性的属性、方法或下标。

  -----通过可空链式调用来访问下标

  可以通过下标来对可空值进行读取或写入,并且判断下标调用是否成功。当通过可空链式调用访问可空值的下标的时候,应该将问号放在下标方括号的前面,可空链式调用的问号一般直接跟在可空表达式的后面。

john.residence?[0] = Room(name: "Bathroom")

  1. let johsnHouse = Residence()
  2. johsnHouse.rooms.append(Room(name: "Living Room"))
  3. johsnHouse.rooms.append(Room(name: "Kitchen"))
  4. john.residence = johsnHouse
  5.  
  6. if let roomCount = john.residence?.numberOfRooms{
  7. print(roomCount)
  8. }else{
  9. print("ni;")
  10. }
  11. if let firstRoomName = john.residence?[0].name
  12. {
  13. print(firstRoomName)
  14. }else{
  15. print("meiyou")
  16. }
  17.  
  18. 运行结果:
  19. 2
  20. Living Room

  -----访问可空类型的下标

  如果下标返回可空类型值,比如在Swift中Dictionary的key下标,可以在下标的闭合括号后面放一个问号来链接下标的可空返回值。

  1. var testScores = ["Bev":[79,94,81],"Dave":[86,82,84]]
  2. testScores["Dave"]?[0] = 91
  3. testScores["Bev"]?[0]++
  4. testScores["Brian"]?[0] = 72--->调用失败
  5. print(testScores)
  6. 打印:
  7. ["Bev": [80, 94, 81], "Dave": [91, 82, 84]]

  -----多层链接

  可以通过链接多个可空链式调用来向下访问属性、方法及下标。但是多层可空链式调用不会添加返回值的可空性。

  1.如果你访问的值不是可空的,通过可空链式调用将会返回可空值;

  2.如果你访问的值已经是可空的,通过可空链式调用不会变的“更”可空;

  1. if let johnStreet = john.residence?.address?.street
  2. {
  3. print(johnStreet)
  4. }else{
  5. print("not street")
  6. }
  1. let someAddress = Address()
  2. someAddress.buildingNumber = "The 29"
  3. someAddress.buildingName = "The ABC"
  4. john.residence?.address = someAddress
  5.  
  6. if let beginsWith = john.residence?.address?.buildingIdentifier()?.hasPrefix("The"){
  7. if beginsWith{
  8. print("the beig")
  9. }else{
  10. print("not the")
  11. }
  12. }else{
  13. print(john.residence?.address?.buildingIdentifier())
  14. }

  在方法的圆括号后面加上问号,是因为buildIdentifier()的返回值是可空值,而不是方法本身是可空的。

  

Swift-09-可空链式调用(Optional Chaining)的更多相关文章

  1. Swift2.1 语法指南——可空链式调用

    原档:https://developer.apple.com/library/prerelease/ios/documentation/Swift/Conceptual/Swift_Programmi ...

  2. swift 学习- 19 -- 可选链式调用

    // 可选链式调用 是一种在当前值可能为 nil 的可选值上请求 和 调用属性, 方法以及下标, 如果 可选值有值, 那么调用就会成功, 如果可选值是 nil, 那么就会将返回 nil , // 多个 ...

  3. Swift中可选型的Optional Chaining 和 Nil-Coalesce(Swift2.1)

    /* 下面是介绍Optional Chaining 和 Nil-Coalesce */ // Optional Chaining (可选链) if let errorMessage = errorMe ...

  4. javascript链式调用实现方式总结

    方法链一般适合对一个对象进行连续操作(集中在一句代码).一定程度上可以减少代码量,缺点是它占用了函数的返回值. 一.方法体内返回对象实例自身(this) function ClassA(){ this ...

  5. Swift Optional Chaining

    Optional Chaining介绍 关于「optional chaining」,<The Swift Programming Language>是这么描述的: Optional cha ...

  6. 这一次搞懂Spring代理创建及AOP链式调用过程

    文章目录 前言 正文 基本概念 代理对象的创建 小结 AOP链式调用 AOP扩展知识 一.自定义全局拦截器Interceptor 二.循环依赖三级缓存存在的必要性 三.如何在Bean创建之前提前创建代 ...

  7. 如何写 JS 的链式调用 ---》JS 设计模式《----方法的链式调用

    1.以$ 函数为例.通常返回一个HTML元素或一个元素集合. 代码如下: function $(){ var elements = []; ;i<arguments.length;i++){ v ...

  8. jquery中链式调用原理

    (1).链式调用 $("#mybtn").css("width","100px") .css("height",&quo ...

  9. javascript方法链式调用和构造函数链式调用对比

    先说一下方法链:B的实例从A继承了A中的同名方法,如果B的方法重载了A中的方法,B中的重载方法可能会调用A中的重载方法,这种方法称为方法链. 构造函数链:子类的构造函数B()有时需要调用父类的构造函数 ...

随机推荐

  1. HDU 4648 Magic Pen 6

    题目链接 6Y什么水平.. #include <cstdio> #include <cstring> #include <string> #include < ...

  2. linux 快捷键

    截图: 打印: 全屏截图 alt+打印:窗口截图 shift+打印:区域截图 ctrl+打印:截图到剪贴板 显示桌面: ctrl+super+d 最大化最小化窗口 ctrl+alt+up/down 转 ...

  3. java 面向对象--------时间作业

    编写Java应用程序.首先,定义一个时钟类——Clock,它包括三个int型 成员变量分别表示时.分.秒,一个构造方法用于对三个成员变量(时.分.秒) 进行初始化,还有一个成员方法show()用于显示 ...

  4. 如何使用数据库保存session的方法简介

    使用数据库保存session的方法 php的session默认是以文件方式保存在服务器端,并且在客户端使用cookie保存变量,这就会出现一个问题,当一个用户由于某种安全原因关闭了浏览器的cookie ...

  5. Bloomberg SEP 12.x 迁移小记

        备份 个文件: D:\Program Files\Symantec\Symantec Endpoint Protection Manager\Server Private Key Backup ...

  6. JS对json对象的调用成员2种方式

    1,控制台上对json对象的调用 //控制台上对json对象的调用 var a={"a":"1","b":"2"} a. ...

  7. 使用Eclipse开发Java Web过程中Debug调试的使用方法

    里介绍的是在Eclipse中的Debug调试. 首先右击项目选择Debug As -- Debug on Server 或者点击Server面板的小昆虫图标,启动Debug模式. 运行web项目,进行 ...

  8. ibatis动态sql配置启动时提示:The content of elements must consist of well-formed character data...

    ibatis动态sql配置启动时提示:The content of elements must consist of well-formed character data... 2012-07-18 ...

  9. 投芯片,现在要n+1模式

    给坚持理想的屌丝点个赞.投芯片,现在要n+1模式,n个小项目+一个大项目.团队是基础,屌丝创业要以营利为先导,先要短快,同时要有并行的大项目支撑.小项目赚的钱先解决面包问题,同时为大项目锻炼队伍积累经 ...

  10. Apache Spark源码走读之17 -- 如何进行代码跟读

    欢迎转载,转载请注明出处,徽沪一郎 概要 今天不谈Spark中什么复杂的技术实现,只稍为聊聊如何进行代码跟读.众所周知,Spark使用scala进行开发,由于scala有众多的语法糖,很多时候代码跟着 ...