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

    1.首先叙述,描述你自己的问题. 假设你想把同意为空值的勾去掉.. .恰巧数据库中的数据 processed_f 为空没有值. . . .这时候你对数据表结构做更改的时候就会出现Data trunca ...

  2. Session小案例------完成用户登录

    Session小案例------完成用户登录     在项目开发中,用户登陆功能再平常只是啦,当用户完毕username和password校验后.进入主界面,须要在主界面中显示用户的信息,此时用ses ...

  3. java提高篇(十四)-----关键字final

    在程序设计中,我们有时可能希望某些数据是不能够改变的,这个时候final就有用武之地了.final是java的关键字,它所表示的是"这部分是无法修改的".不想被改变的原因有两个:效 ...

  4. String、StringBuffer和StringBuilder

    一.String和StringBuffer String类型和StringBuffer类型的主要性能差别事实上在于String是不可变的对象,因此在每次对String类型进行改变的时候事实上都等同于生 ...

  5. hdu4888 Redraw Beautiful Drawings

    14更多学校的第二个问题 网络流量   分别以行,列作为结点建图 i行表示的结点到j列表示的结点的流量便是(i, j)的值 跑遍最大流   若满流了便是有解   推断是否unique  就是在残余网络 ...

  6. 腾讯2014在广州站实习生offer经验(TEG-开发背景)

    研究在过去的一年是linux 什么系统编程和网络编程.比较熟悉的语言c/c++,python只写一些测试client.是后台开发类,比方前面笔面的网易CC(面完hr后挂).大概3月15号就在腾讯 jo ...

  7. NIVC->IPR[IPADDR]

    #include <stm32f10x.h>   #include "sys.h" //表偏移地址 //NVIC_VectTab:基址 //Offset:偏移量 //C ...

  8. HTTP工作原理

     HTTP工作过程 HTTP协议定义Webclient怎样从Webserver请求Web页面,以及server怎样把Web页面传送给client.HTTP协议採用了请求/响应模型. client向 ...

  9. 【源代码】Set集合源代码剖析

    注:下面源代码基于jdk1.7.0_11 Set集合事实上是对Map集合的封装,Map集合存储的是键值对,那么我们将值隐藏,不向外界暴露,这样就形成了Set集合. 相应Map集合的两个非常重要的实现H ...

  10. Android分享到微信等社交平台教程

    在Android手机app上增加分享到微信等平台的功能,使用的是第三方的开源组件,友推SDK. 集成分为下面几个步骤: 1. 在友推官网注冊,加入要集成友推sdk的 app信息,并获取appkey. ...