选项链是使用选项来查询和调用其属性、方法或下标的一个过程,假设选项包括一个值,则属性、方法、下标的查询和调用成功,否则,调用返回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).")

}


苹果新的编程语言 Swift 语言进阶(十二)--选项链的更多相关文章

  1. 苹果新的编程语言 Swift 语言进阶(二)--基本数据类型

    一  .   常量和变量 Swift语言 对常量和变量的声明进行了明确的区分 Swift语言的常量类型比C 语言的constants类型更加强大,语义更加明确. 常量和变量的区别是常量在设置或初始化后 ...

  2. 苹果新的编程语言 Swift 语言进阶(十五)--协议

    协议定义了适合某个特定任务或功能需要的方法.属性和其它需求的一个蓝图.协议本身不提供这些需求的实现,它只是描述了一个任务或功能实现的蓝图. 协议与java 语言中的接口定义类似,都是描述了一个实现可以 ...

  3. 苹果新的编程语言 Swift 语言进阶(十四)--扩展

    扩展是为一个已经存在的类.结构.枚举类型添加新功能的一种方式,包括为不能存取源代码的那些已经存在的类型添加功能. 扩展类似于Objective-C语言中的类别,与类别不同的是Swift语言的扩展没有名 ...

  4. 苹果新的编程语言 Swift 语言进阶(十六)--泛型

    泛型允许你定义一个宽松.可重用的函数或者类型,使用泛型能够避免代码的重复,也能以更清楚和抽象的方式来表达程序的意图. 泛型是Swift语言提供的强大功能之一,Swift提供的许多标准库都使用了泛型来创 ...

  5. 苹果新的编程语言 Swift 语言进阶(一)--综述

    Swift 是苹果开发和提供的供开发IOS 和OS X应用的一门新的语言.Swift语言基于C 和Objective-C语言,除了提供C 和Objective-C语言具有的所有语法功能外,为了编程方便 ...

  6. 苹果新的编程语言 Swift 语言进阶(三)--基本运算和扩展运算

    一 基本操作运算 1. 赋值操作 在Swift 中,能够使用赋值操作为一个常量或一个变量赋值,也能够使用多元组一次为多个常量或变量赋值. Swift 的赋值操作与其他语言最大的不同是赋值操作除了可以为 ...

  7. 苹果新的编程语言 Swift 语言进阶(七)--枚举、结构、类

    Swift语言中,具有类特征的类型包括三种,即枚举类型.结构类型(包括基本类型,基本类型实际都是结构类型的特例).类.其中枚举类型.结构类型是属于值类型,类属于引用类型.三种类型都可以添加属性.方法. ...

  8. 苹果新的编程语言 Swift 语言进阶(四)--字符串和收集类型

    一.字符串( String  )和字符类型(Character) 字符串是一种字符的带次序的收集类型(相当于数组),字符是字符串中的元素. 在Swift 语言中,字符串是编码独立的Unicode字符的 ...

  9. 苹果新的编程语言 Swift 语言进阶(五)--控制流

    Swift 语言支持C语言全部的控制语句.包含for  和while循环语句,if和switch条件语句,以及break和continue控制语句等. Swift 语言除了支持以上语句,还添加了一个f ...

随机推荐

  1. 【转】tomcat 访问软连接文件夹下的网页出现404错误,description The requested resource (/xxx.html) is not available.

    在 tomcat/webapps/ROOT/ 下建立一个软连接文件ln -s /home/ubuntu/report report   再到report软连接目录里建立个 report.html通过浏 ...

  2. MySQL性能、监控与灾难恢复

    原文:MySQL性能.监控与灾难恢复 监控方案:     up.time    http://www.uptimesoftware.com/    收费     Cacti        http:/ ...

  3. OpenWrt wireless通过配置uci生效

    [转载请注明出处:钱正柱 http://blog.csdn.net/qianguozheng/article/details/24412673] 配置无线 vi /etc/config/wireles ...

  4. SqlServer 添加列并赋值

    有个需求,需要给某张表添加一列并且赋值,分解需求,一共分两部走: 添加列 赋值 两个功能都不难,很快实现. --add column alter table Med_Summary_Template ...

  5. (四)左右ng-app自己主动bootstrap相框

    博客之前 (三)ng-app的使用困惑和angularJS框架的自己主动载入 提出了使用ng-app指令的情况.之前认为出现第4和第5种情况非常奇怪,由于仅仅看到了现象,没有看到本质.JS错误.最直观 ...

  6. 代码配置没有问题,为什么不回滚事务(要理解Mysql数据库引擎)

    在发展的前几天遇到的问题,在调试过程中发现配置service本次交易不工作层,更新后数据库抛出异常或成功,交易不会回滚.随后开始了各种检查,视图spring的事务是否配置正确,进入更新方法时是否开启了 ...

  7. Web 前端开发环境

    创建 Web 前端开发环境 Web 前端开发涉及多种工具,这里将常用工具的安装和配置进行说明,提供了详细的说明,为后继的开发创建一个坚实的基础. 本文介绍的工具有:NodeJS, NPM, Bower ...

  8. UOJ #5. 【NOI2014】动物园 扩大KMP

    第一次NOI称号. ... 扩展假设知道KMP如果. .. . 就是水题了. ... #5. [NOI2014]动物园 统计提交情况 描写叙述 提交 近日.园长发现动物园中好吃懒做的动物越来越多了.比 ...

  9. 蜗牛—苍茫IT文章大学的路(十)

    昨晚,有个叫***培训机构鼓吹我们学校.起初我还以为是介绍这个游戏吧.谁知道.它原来是一个培训结构.去年我买的表啊 我知道这会不会去,我也浪费了时间审查.因为今天下午和晚上来测试啊.我没有审查,. 当 ...

  10. Java Web整合开发(4) -- JSP

    JSP脚本中的9个内置对象: application:    javax.servlet.ServletContext config:          javax.servlet.ServletCo ...