在oc中没有optional 的概念,一个对象可能有很多属性,每个属性都个能还有自己的属性。OC中可以连续调用没有任何问题,即使调用过程中出现了nil,那么整个语句都是nil。
但是在Swift中引入了Optional的概念。强制我们对有可能为nil的值解包。在上面的调用情境中就很不方便。但是好在Swift对这种情况也有了相应的支持
1.使用?来进行optional chaining
场景
enum Type {
case CREDIT
case DEPOSIT
}
class BankCard {
var type : Type = .CREDIT
}
class Person {
var card: BankCard?
init(card:BankCard? = nil){
self.card = card
}
}
var person1 : Person? = nil
var person2 : Person? = Person(card:nil)
var person3 : Person? = Person(card:BankCard())
链式调用
person1?.card?.type //nil
person2?.card?.type //nil
person3?.card?.type //CREDIT
2.重载操作符
infix operator => {associativity left}
func => <T,U>(opt: T?,f: T -> U?) -> U? {
switch opt {
case .Some(let t):
return f(t)
case .None :
return .None
}
}
person1=>{$0.card}=>{$0.type} //nil
person2=>{$0.card}=>{$0.type} //nil
person3=>{$0.card}=>{$0.type} //CREDIT
3.使用flatMap函数
person1.flatMap({$0.card}).flatMap({$0.type}) //nil
person2.flatMap({$0.card}).flatMap({$0.type}) //nil
person3.flatMap({$0.card}).flatMap({$0.type}) //CREDIT