Swift::4::可选型.2
2014-10-27 00:00
295 查看
摘要: 介绍可选型链(Optional Chaining),隐式解包可选型(Implicitly Unwrapped Optionals)
#可选型
如果你想知道某个具体的Person的Pet有没有喜欢的Toy,就可以这么写:
使用if let 语法,是不是很接近我们平时说话的疑问句?当然,你也可以逐个对可选型进行if let 测试,但Swift 直接支持这种链式的测试,更为简洁。
注意:链中任意一个可选型为nil, if let 测试就会为false,就像‘掉链子’一样,另外,在可选型链中返回的值也是可选型,而不管变量/常量是否定义成可选型的,上例的name 并没有定义成可选的,但if let 中返回的值其实是可选型的。
和普通的可选型唯一不同是在类型后加'!',而在使用这种可选型变量,不需要再解包!Swift 已经帮你自动完成。
###为什么使用
Swift 要求所有的变量都应该包含值,否则报错,除非你显式声明为可选型。比如,在OC中,任何对象类型都可以初始成nil,所以,你在Swift在使用OC的对象类型,就要支持nil值,于是就要使用到可选型。不过多数情况下,如果要使用OC 中基于NSObject的对象类型,声明为隐式解包可选型即可,下面举个例子:
函数中参数使用了隐式解包可选型,目的是假设传入的参数不为nil,使得函数执行更为安全。如果一旦传入为nil,程序就会报异常甚至崩溃。通常隐式解包可选型,更适合于用在Objective-C APIs。
另外,隐式解包可选型仍然是可选型,可以进行值绑定,if let以及可选型链中。
本文参考:http://www.codingexplorer.com/optional-chaining-implicitly-unwrapped-optionals-swift/
#可选型
可选型链(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/
相关文章推荐
- Swift Optional 可选型的解包简单使用
- swift可选型
- Swift 隐式可选型
- swift 进阶笔记 (一) —— 可选型
- swift 可选型的使用详解
- Swift之可选型
- swift 系统学习 05 聚合(空合)解包 链式解包 可选型和元组的结合
- Swift 可选型
- Swift 可选型解包
- swift 隐式可选型实例详解
- swift 可选型、拆包
- swift 4.1 可选型optional
- Swift之可选型
- swift 可选型的实际使用
- 六、Swift可选型与拆解包
- swift 隐式可选型
- Swift::3::可选型.1
- swift 可选型的使用
- swift 进阶笔记 (一) —— 可选型
- swift block