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

    在实际执行过程中的线程,我们经常需要同步多线程. 然后你可以使用互斥锁来完成任务:在使用过程中互斥锁,有pthread_mutex_init,pthread_mutex_destory,pthread ...

  2. Codeforces 327B-Hungry Sequence(素数筛)

    B. Hungry Sequence time limit per test 1 second memory limit per test 256 megabytes input standard i ...

  3. leaflet开源地图库源码 浏览器&移动设备判断(browser.js)备份

    <script> var isIe = !-[1,]; // alert('ie9 之前'+isIe); var ie = 'ActiveXObject' in window; //ale ...

  4. js 性能优化整理之 高频优化

    mousemove 拖拽操作 var count = 0; elem.onmousemove = function(){ count++; // 当计数器为偶数的时候不执行mousemove if( ...

  5. Nginx+Php-fpm+MySQL+Redis源码编译安装指南

    说明:本教程由三部分组成如下: 1.      源码编译安装Nginx 2.      源码编译安装php以及mysql.redis扩展模块 3.      配置虚拟主机 文中所涉及安装包程序均提供下 ...

  6. debian(wheezy) chrome beta 38.0.2x.xxx Shockwave Flash was crashed 该解决方案崩溃.

    版本号chrome beta升级到38.0.2x.xxx什么时候, flash他挂了. 调试 ./libpepflashplayer.so: /lib/x86_64-linux-gnu/libc.so ...

  7. Linux 2.6 完全公平调度算法CFS(Completely Fair Scheduler) 分析

    转会http://www.ibm.com/developerworks/cn/linux/l-completely-fair-scheduler/index.html? ca=drs-cn-0125 ...

  8. Java虚拟机参数设置(转)

    今天在加载一幅图片时,eclipse报出如下错误: “Exception in thread "main" java.lang.OutOfMemoryError: Java hea ...

  9. quick-cocos2d-x游戏开发【6】——制作您自己的自定义效果button菜单

    前面提到的主菜单使用,还是很easy的,但我们在商业产品.经常看到button他们人很好,照片不仅就好了,和动画也很不错.Candy Crash都玩过吧,他们看到,button.真的像果冻,效果确实非 ...

  10. ruby简单的基本 6

    模 像类似的模块,那里 class method 和 instance method.module 没有new不能生成对象的例子其中 class method 所谓的模块在模块化的方法,它能够直接调用 ...