网站大量收购独家精品文档,联系QQ:2885784924

可选链 - Optional Chaining.pdf

  1. 1、本文档共8页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
可选链 - Optional Chaining

可选链 - Optional Chaining Optional Chaining 可选链 (Optional Chaining )是⼀种可以请求和调⽤属性、⽅法及下标脚本的过程, 它的可选性体现 请求或调⽤的⽬标当前可能为空 (nil)。如果可选的⽬标有值, 那么调⽤就会成功;相反,如果选择的⽬标为空 (nil),则这种调⽤将返回空 (nil)。多次请求或调⽤可以被链接在⼀起形成⼀个链,如果任何⼀个节点为空 (nil)将导致整个链失效。 注意: Swift 的可选链和 Objective-C 中的消息为空有些相像,但是 Swift 可以使 ⽤在任意类型中,并且失败与否可以被检测到。 可选链可替代强制解析 通过在想调⽤的属性、⽅法、或下标脚本的可选值 (optional value) (⾮空) 后⾯放⼀个问号,可以定义⼀个可选链。这⼀点很像在可选值后⾯放⼀个叹号来强制 拆得其封包内的值。它们的主要的区别在 当可选值为空时可选链即刻失败,然⽽⼀ 般的强制解析将会引发运⾏时错误。 为了反映可选链可以调⽤空 (nil),不论你调⽤的属性、⽅法、下标脚本等返回的 值是不是可选值,它的返回结果都是⼀个可选值。你可以利⽤这个返回值来检测你的 可选链是否调⽤成功,有返回值即成功,返回nil则失败。 调⽤可选链的返回结果与原本的返回结果具有相同的类型,但是原本的返回结果被包 装成了⼀个可选值,当可选链调⽤成功时,⼀个应该返回Int的属性将会返回Int?。 下⾯⼏段代码将解释可选链和强制解析的不同。 ⾸先定义两个类Person和Residence。 class Person { var residence: Residence? } class Residence { var numberOfRooms = 1 } Residence具有⼀个Int类型的numberOfRooms,其值为 1。Person具有⼀个可 选residence属性,它的类型是Residence?。 如果你创建⼀个新的Person实例,它的residence属性由 是被定义为可选型的, 此属性将默认初始化为空: let john = Person( 如果你想使⽤感叹号 (!)强制解析获得这个⼈residence属性numberOfRooms属 性值,将会引发运⾏时错误,因为这时没有可以供解析的residence值。 let roomCount = john.residence!.numberOfRooms //将导致运⾏时错误 当john.residence不是nil时,会运⾏通过,且会将roomCount 设置为⼀个int 类型的合理值。然⽽,如上所述,当residence为空时,这个代码将会导致运⾏时 错误。 可选链提供了⼀种另⼀种获得numberOfRooms的⽅法。利⽤可选链,使⽤问号来代 替原来!的位置: if let roomCount = john.residence?.numberOfRooms { println(Johns residence has \(roomCount room(s . } else { println(Unable to retrieve the number of rooms. } // 打印 Unable to retrieve the number of rooms. 这告诉 Swift 来链接可选residence?属性,如果residence存在则取回 numberOfRooms的值。 因为这种尝试获得numberOfRooms的操作有可能失败,可选链会返回Int?类型值, 或者称作“可选Int” 。当residence是空的时候 (上例),选择Int将会为空,因此 会出现⽆法访问numberOfRooms的情况。 要注意的是,即使numberOfRooms是⾮可选Int (Int?)时这⼀点也成⽴。只要是通 过可选链的请求就意味着最后numberOfRooms总是返回⼀个Int?⽽不是Int。 你可以⾃⼰定义⼀个Residence实例给john.residence,这样它就不再为空了: john.residence = Residence( john.residence 现在有了实际存在的实例⽽不是nil 了。如果你想使⽤和前⾯⼀样 的可选链来获得n

文档评论(0)

ldj215322 + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档