Swift中的Optional
2019-06-29 本文已影响0人
盖小聂
1、隐式解包Optional
2、Optional Chaining
3、多重Optional
4、Optional Map
5、JSON
1、隐式解包Optional
- 在声明的时候,我们可以通过在类型后加上一个感叹号(!)这个语法糖来告诉编译器我们需要一个可以隐式解包的Optional值:
var maybeObject: MyClass!
- 首先需要明确的是,隐式解包的Optional本质上与普通的Optional值并没有任何不同,只是我们在对这类变量的成员或方法进行访问的时候,编译器会自动为我们在后面插入解包符号!。隐式解包不意味着“这个变量不会是nil,你可以放心使用”这种暗示,只能说Swift通过这个特性给了我们一种简便但是危险的使用方式罢了。
- 现在比较常见的隐式解包的Optional就只有使用Interface Builder时建立的IBoutlet了:
@IBOutlet weak var button: UIButton!
- 在我们的代码的其他部分,还是少用这样的隐式解包的Optional为好,很多时候多写一个Optional Binding就可以避免掉不少应用奔溃的风险。
2、Optional Chaining
- 使用Optional Chaining所得到的东西其实都是Optional的
//toyName的类型为String?,这是由于在Optional Chaining中我们在任意一个?.的时候都可能遇到nil而提前返回,
//这个时候当然就只能拿到nil了
let toyName = xiaoming.pet?.toy?.name
- 使用Optional Binding来直接取值:
if let toyName = xiaoming.pet?.toy?.name {
//太好了,小明既有宠物,而且宠物还正好有个玩具
}
3、多重Optional
- 很多读者应该已经知道,我们使用的类型后加上?的语法只不过是Optional类型的语法糖,而实际上这个类型是一个enum。
var aNil: String? = nil
var anotherNil: String?? = aNil
var literalNil: String?? = nil
- anotherNil和literalNil是不等效的。anotherNil是盒子中包了一个盒子,打开内存的盒子的时候我们会发现空气;但是literalNil是盒子中直接是空气。
if let a = anotherNil {
print(“anotherNil”)
}
if let b = literalNil {
print(“literalNil)
}
这样的代码只能输出anotherNil
4、Optional Map
- 我们经常会对Array类型使用map方法,这个方法能对数组中的所有元素应用某个规则,然后返回一个新的数组。
let arr = [1,2,3]
let doubled = arr.map {
$0 * 2
}
- 不仅在Array或者说CollectionType里可以用map,如果我们仔细看过Optional的声明的话,会发现它也有一个map方法。
let num: Int? = 3
let result = num.map {
$0 * 2
}
5、JSON
- 因为Swift对于类型的要求非常严格,所以在解析完JSON之后想要从结果的AnyObject中获取某个键值是一件非常麻烦的事情。如果我们能够重载下标的话,就可以通过下标的取值配合Array和Dictionary的Optional Binding来简单的在JSON中取值。json-swift和SwiftyJSON这样的项目,使用了重载下标访问的方式简化了JSON操作。
if let value = JSON(json)[“menu”][“popup”][“menuitem”][0][“value”].string {
print(value)
} //json is a AnyObject from JSONObjectWithData