苹果新的编程语言 Swift 语言进阶(十二)--选项链

选项链是使用选项来查询和调用其属性、方法或下标的一个过程,如果选项包含一个值,则属性、方法、下标的查询和调用成功,否则,调用返回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 语言进阶(十二)--选项链

时间: 2024-11-06 07:14:44

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

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

1.进入短信界面 2.菜单-设置 3.修改短信中心号码(Set the SIM's smsc number) 保存 [测试结果]:提示保存成功,但是号码没有改变,退出重新进入设置才会看到号码更新 [预期结果]:提示保存成功,号码变为修改过的号码 相关Activity:通过Logcat中I/ActivityManager( 896):我们可以定位到该类-MessagingPreferenceActivity: 相关控件:mSmscPrefList.add(pref); 根据分析我们发现在Messa

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

Swift语言的扩展是为一个已经存在的类.结构.枚举类型添加新功能的一种方式,包括为不能存取源代码的那些已经存在的类型添加功能.        扩展类似于Objective-C语言中的类别,与类别不同的是Swift语言的扩展没有名字.        扩展能够为已存在类型:     1)增加计算属性和计算静态属性:     2)定义新的实例方法和类型方法:     3)提... 请转移到此位置继续阅读,谢谢! 苹果新的编程语言 Swift 语言进阶(十四)--扩展 苹果新的编程语言 Swift 语

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

协议定义了适合某个特定任务或功能需要的方法.属性和其它需求的一个蓝图.协议本身不提供这些需求的实现,它只是描述了一个任务或功能实现的蓝图.       协议与java 语言中的接口定义类似,都是描述了一个实现可以干什么,而本身却不包含任何实现.与接口不同的是swift语言定义的协议可以被一个类.结构.或者枚举采用,来提供协议规定需求的实际实现,而java 语言的接口只能被类实现.   ... 请麻烦转移到此位置阅读,谢谢! 苹果新的编程语言 Swift 语言进阶(十五)--协议 苹果新的编程语言

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

泛化允许你定义一个宽松.可重用的函数或者类型,使用泛化能够避免代码的重复,也能以更清楚和抽象的方式来表达程序的意图. 泛化是Swift语言提供的强大功能之一,Swift提供的许多标准库都使用了泛化来创建,如Swift提供的数组和词典类型.通过使用泛化,你能使用一个数组和词典来包含和存储任何类型的元素. 1.1 泛化函数 使用Swift语言你能定义一个可以工作于任意类型的泛化函数,从而不必为每种类型都定义一个具有相同功能的函数,这样就可以大大减少代码的重复. 如对一个实现任意类型值交换(swap)

苹果新的编程语言 Swift 语言进阶(八)--属性

请转移到此位置阅读,谢谢! 苹果新的编程语言 Swift 语言进阶(八)--属性 http://blog.csdn.net/goohong/article/details/32096289 苹果新的编程语言 Swift 语言进阶(八)--属性,布布扣,bubuko.com

苹果新的编程语言 Swift 语言进阶(十一)--实例的初始化与类的析构

一 .实例的初始化          实例的初始化是准备一个类.结构或枚举的实例以便使用的过程.初始化包括设置一个实例的每一个存储属性为一个初始值,以及执行任何其它新的实例能够使用之前需要的设置或初始化. 一个类.结构或枚举能定义一个初始化方法来设置它的特性,用来确保它的实例的所有属性都有有效的初始值. 通过调用类.结构或枚举提供的初始化方法来执行实例的初始化过程. 类的实例也能实现一个析构,用来在类的实例释放之前执行任何特定的清除过程来释放分配的专有资源. 1 . 初始化方法的定义 初始化方法

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

一. 枚举 枚举定义了一种包含一组相关值的公共类型.枚举是Swift中的一种与类类似的类型,具有许多传统类才有的特征,例如计算属性.实例方法,能够通过扩展或协议增强功能等. 1.1 枚举定义 Swift 语言的枚举类型的定义语法如下: enum CompassPoint { case North case South case East case West } 枚举语法以一个关键字enum来标识,enum后面包含一个枚举类型名字,枚举定义全部放到一对大括号中. 在枚举中定义的值称为枚举成员值,用

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

一 基本操作运算 1. 赋值操作 在Swift 中,可以使用赋值操作为一个常量或一个变量赋值,也可以使用多元组一次为多个常量或变量赋值. Swift 的赋值操作与其它语言最大的不同是赋值操作除了能够为变量或常量赋值外本身不能够返回值. 这个特征可以避免某些条件下赋值操作错误地用于相等比较操作. 如在C语言中,if (x = =y) 很容易误写作if (x = y) ,虽然逻辑结果不正确,但C语言的编译器却无法检查出这种情况,而Swift 语言却可以有效避免这种情况发生,因为 在Swift 中if

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

Swift 是苹果开发和提供的供开发IOS 和OS X应用的一门新的语言.Swift语言基于C 和Objective-C语言,除了提供C 和Objective-C语言具有的所有语法功能外,为了编程方便和高效,Swift在语法上作了大量的优化和改进. Swift采用安全编程模式,具有许多先进的强大的功能 ,如动态运行时.编译动态进行类型检查.Closures.下标功能.自动引用计数.选项类型.通用类型和类型编译时推断.类型的扩展和嵌套.协议类型.功能和类型的通用化.操作符的定制和添加. Swift