- 1、本文档共8页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 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)