首页 技术 正文
技术 2022年11月15日
0 收藏 896 点赞 2,429 浏览 1959 个字

选项链是使用选项来查询和调用其属性、方法或下标的一个过程,假设选项包括一个值,则属性、方法、下标的查询和调用成功,否则,调用返回nil。

选项链能用在不论什么类型的选项来检查对其一个属性、方法、下标的查询和调用是否成功。

选项链能够作为强制展开的替代方式使用,但选项链的使用更加安全,不会触发一个执行时错误。

在调用一个选项的属性、方法或下标方法时,通过在该选项值的后面放置一个(?)标记来规定一个选项链。这与在选项值后放置一个(!)
来强制展开选项的值很相似。基本的不同是在选项值为nil时选项链可以得体的失败,不会触发一个执行时错误。

选项链与Objective-C语言中的发消息给nil类似,选项链能同意在一个nil值上进行属性、方法、下标的调用和查询。为了反应这个事实,   选项链的调用结果总是返回一个选项值,即使你查询的属性、方法、下标返回一个非选项值的情况。然后能够使用这个返回值来检查选项链的调用是否成功。

尤其是选项链的返回结果除了被封装为一个选项外与返回值的类型同样。如一个正常返回一个Int的属性当使用 选项链来存取时返回一个整形选项(Int?)。

以下样例展示了选项链的使用:

classPerson
{

var residence:Residence?

}

class Residence {

var rooms
=Room[]()

var numberOfRooms:Int
{

return rooms.count

}

subscript(i:Int)
->Room {

return rooms[i]

}

var address:Address?

}

class Room {

let name:String

init(name:String)
{self.name =name
}

}

class Address {

var buildingName:String?

var buildingNumber:String?

var street:String?

func buildingIdentifier()
->String? {

if buildingName
{

return buildingName

}else if buildingNumber
{

return buildingNumber

}else {

return nil

}

}

}

let john
=Person()

if let roomCount
=john.residence?.numberOfRooms
{

println("John’s residence
has\(roomCount) room(s).")

}else {

println("Unable to
retrieve the number of rooms.")

}

以上样例中john实例的属性residence是一个选项,在没有为john实例的属性residence赋值时,运行else分支,假设john实例的属性residence已经赋值,则运行if 分支。而不管哪种情况,代码都不会出现运行时错误。

多个选项链能链接到一起,假设链上的不论什么链接返回nil,则整个链失败。这同意检查和调用一个选项属性的子属性包括的属性、方法、下标方法以及更深的调用。例如以下样例展示了多个选项链怎样链接到一起。

if let
johnsStreet = john.residence?.address?.street {

println("John’s
street name is\(johnsStreet).")

}else {

println("Unable
to retrieve the address.")

}

下例展示怎样通过选项链调用下标方法:

if let firstRoomName
=john.residence?[0].name
{

println("The first
room name is\(firstRoomName).")

}else {

println("Unable to
retrieve the first room name.")

}

下例展示怎样通过选项链调用一个实例方法。

if let buildingIdentifier
=john.residence?.address?.buildingIdentifier()
{

println("John’s building
identifier is\(buildingIdentifier).")

}

因为Address实例方法buildingIdentifier返回的也是一个选项,因此还能够进一步链接。例如以下所看到的:

if let
upper = john.residence?.address?.buildingIdentifier()?.uppercaseString {

println("John’s
uppercase building identifier is\(upper).")

}

相关推荐
python开发_常用的python模块及安装方法
adodb:我们领导推荐的数据库连接组件bsddb3:BerkeleyDB的连接组件Cheetah-1.0:我比较喜欢这个版本的cheeta…
日期:2022-11-24 点赞:878 阅读:9,088
Educational Codeforces Round 11 C. Hard Process 二分
C. Hard Process题目连接:http://www.codeforces.com/contest/660/problem/CDes…
日期:2022-11-24 点赞:807 阅读:5,564
下载Ubuntn 17.04 内核源代码
zengkefu@server1:/usr/src$ uname -aLinux server1 4.10.0-19-generic #21…
日期:2022-11-24 点赞:569 阅读:6,412
可用Active Desktop Calendar V7.86 注册码序列号
可用Active Desktop Calendar V7.86 注册码序列号Name: www.greendown.cn Code: &nb…
日期:2022-11-24 点赞:733 阅读:6,185
Android调用系统相机、自定义相机、处理大图片
Android调用系统相机和自定义相机实例本博文主要是介绍了android上使用相机进行拍照并显示的两种方式,并且由于涉及到要把拍到的照片显…
日期:2022-11-24 点赞:512 阅读:7,822
Struts的使用
一、Struts2的获取  Struts的官方网站为:http://struts.apache.org/  下载完Struts2的jar包,…
日期:2022-11-24 点赞:671 阅读:4,905