您的位置:首页 > 移动开发 > Swift

Swift::4::可选型.2

2014-10-27 00:00 295 查看
摘要: 介绍可选型链(Optional Chaining),隐式解包可选型(Implicitly Unwrapped Optionals)

#可选型

可选型链(Optional Chaining)

当你定义了一个类,类又包含一个属性,而属性是一个可选型的类变量,这个类定义又包含另一个可选型的属性,如此层层嵌套,就会形成所谓的可选型链,比如,一个Person 又一个Pet,而Pet 有对应喜欢的Toy,但Pet,Toy均为可选型,这就形成了链:

class Person
{
var pet: Pet?
}

class Pet
{
var name: String

var favoriteToy: Toy?

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

class Toy
{
var name: String

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

如果你想知道某个具体的Person的Pet有没有喜欢的Toy,就可以这么写:

if let someToy = jim.pet?.favoriteToy?.name
{
println("This person's pet likes the \(someToy).")
}
else
{
println("This person's pet does not have a favorite toy")
}

使用if let 语法,是不是很接近我们平时说话的疑问句?当然,你也可以逐个对可选型进行if let 测试,但Swift 直接支持这种链式的测试,更为简洁。

注意:链中任意一个可选型为nil, if let 测试就会为false,就像‘掉链子’一样,另外,在可选型链中返回的值也是可选型,而不管变量/常量是否定义成可选型的,上例的name 并没有定义成可选的,但if let 中返回的值其实是可选型的。

隐式解包可选型(Implicitly Unwrapped Optionals)

上一篇文章介绍过普通的可选型定义,Swift 还提供一种特别的可选型--隐式解包可选型。隐式解包的意思是自动解包。先看定义:

var shouldBeASensorReadingHere: Int! = 42
var testAnswer = 30 + shouldBeASensorReadingHere

和普通的可选型唯一不同是在类型后加'!',而在使用这种可选型变量,不需要再解包!Swift 已经帮你自动完成。

###为什么使用
Swift 要求所有的变量都应该包含值,否则报错,除非你显式声明为可选型。比如,在OC中,任何对象类型都可以初始成nil,所以,你在Swift在使用OC的对象类型,就要支持nil值,于是就要使用到可选型。不过多数情况下,如果要使用OC 中基于NSObject的对象类型,声明为隐式解包可选型即可,下面举个例子:

override func tableView(tableView: UITableView!, cellForRowAtIndexPath indexPath: NSIndexPath!) -> UITableViewCell!

函数中参数使用了隐式解包可选型,目的是假设传入的参数不为nil,使得函数执行更为安全。如果一旦传入为nil,程序就会报异常甚至崩溃。通常隐式解包可选型,更适合于用在Objective-C APIs。

另外,隐式解包可选型仍然是可选型,可以进行值绑定,if let以及可选型链中。

本文参考:http://www.codingexplorer.com/optional-chaining-implicitly-unwrapped-optionals-swift/
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息