Swift 可选值

来源:互联网 发布:验血公司theranos知乎 编辑:程序博客网 时间:2024/06/17 09:56

Swift 可选值


1.研究案例:字典

let cities = ["Paris": 2241, "Madrid": 3165, "Amsterdam": 927, "Berlin": 3562]let madridPopulation: Int = cities["Madrid"]!

字典存储的是欧洲城市的人口数量. 我们无法保证查询操作总返回Int值. Swift 可选类型可以表达这种失败的可能性, 这个例子的正确取值方式如下:

//madridPopulation可能为Int值或者nillet 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? = 3let y: Int? = 5func 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}
原创粉丝点击