Swift 可选值
1.研究案例:字典
let cities = ["Paris": 2241, "Madrid": 3165, "Amsterdam": 927, "Berlin": 3562] let madridPopulation: Int = cities["Madrid"]!
字典存储的是欧洲城市的人口数量. 我们无法保证查询操作总返回Int值. Swift 可选类型可以表达这种失败的可能性, 这个例子的正确取值方式如下:
//madridPopulation可能为Int值或者nil let madridPopulation: Int? = cities["Madrid"]
检验查询是否成功
if madridPopulation != nil { print("The population of Madrid is \(madridPopulation! * 1000)") } else { print("Unkonwn city: madrid") }
后缀运算符!强制将一个可选类型转换为不可选类型.
Swift有一种特殊的可选绑定(optional binding)机制, 可以避免强制解包(!)
if let madridPopulation = madridPopulation { print("The population of Madrid is \(madridPopulation! * 1000)") } else { print("Unkonwn city: madrid") }
如果可以选择建议使用可选绑定而非强制解包. 如果有一个nil的值, 强制解包回导致程序崩溃;可选绑定则会处理异常避免错误.
Swift 还为!提供了安全的替代者??.使用这个运算符则需额外提供一个默认值, 当值为nil是会返回默认值,它的定义是这样的:
infix operator ?? func ??(optional: T?, defaultValue: T) -> T { if let x = optional { return x } else { return defaultValue } }
2.玩转可选值
可选值链
Swift 可选值链,它用于在被嵌套的类或结构体中对方法或属性进行选择.下面为订单类型的代码片段:
struct Order { let orderNumber: Int let person: Person? } struct Person { let name: String let address: Address? } struct Address { let streetName: String let city: String let State: String? }
获取客户地址的state:
order.person!.address!.State!
然而中间任何数据缺失都会导致程序奔溃, 使用可选绑定相对安全:
if let person = order.person { if let address = person.address { if let state = address.State { print(state) } } }
但这样有太繁琐.使用可选链, 将会变成:
if let state = order.person?.address?.State { print(state) } //使用?进行可选类型解包, 任意数据缺失都会返回nil
可选绑定
同时绑定多个可选值:
let x: Int? = 3 let y: Int? = 5 func addOptionals(optionalX: Int?, optionalY: Int?) -> Int? { if let x = optionalX, y = optionalY { return x + y } else { return nil } } func addOptionals2(optionalX: Int?, optionalY: Int?) -> Int? { guard let x = optionalX, y = optionalY else { return nil } return x + y }