Swift 可选链 (翻译)
使用可选值有时会让人感到有点笨拙,所有的解包和检查会变得如此繁重,以至于会让你想要丢几个感叹号上去强制解包,好让你能继续工作下去。但是请小心:假如你强制解包一个没有值的可选值,你的代码就崩了。
Swift 有两个技术来帮助你减少代码的复杂度。首要的就是可选链,它只允许在可选值有值时运行代码。让我们来试试,复制下面的代码到 playground :
func albumReleased(year: Int) -> String? { switch year { case 2006: return "Taylor Swift" case 2008: return "Fearless" case 2010: return "Speak Now" case 2012: return "Red" case 2014: return "1989" default: return nil }}let album = albumReleased(year: 2006)print("The album is \(album)")
这段代码将在调试窗口输出 The album is Optional("Taylor Swift")
。
假如我们想将 albumReleased()
的返回值转换为大写(即输出 TAYLOR SWIFT 而不是 Taylor Swift ),我们可以调用 string 的 uppercased() 方法。如下所示:
let str = "Hello world"print(str.uppercased())
可问题是,albumReleased()
返回的是一个可选 string : 它可能返回一个 string ,也可能什么也不返回。所以,我们的实际意思是:假如我们得到一个 string ,就转为大写,否则啥都别做。这就是可选链的用武之地了,由于它就提供了这样的能力。
试着把最后两行代码改成下面这样:
let album = albumReleased(year: 2006)?.uppercased()print("The album is \(album)")
注意这里有个“问号”,这就是可选链:在“问号”后的所有代码,只会在“问号”前的代码有值时,才会运行。这不会影响 album 的基本数据类型,由于无论这行返回 nil 还是大写的 album 名称,它都是一个可选 string 。
可选链可以是任意长度,比方:
let album = albumReleased(year: 2006)?.someOptionalValue?.someOtherOptionalValue?.whatever
Swift 将会从左到右检查它们,直到遇到一个 nil 后中止。
nil 合并运算符
其实这是 Swift 提供的一个简单功能,可以使你的代码更简单、更安全,只不过名字起的有些夸张,让人害怕它。这令人汗颜,假如你花时间弄明白 nil 合并运算符,会使你的生活更轻松。
它起的作用就如同你会说“假如可以的话,使用 A 的值,假如 A 是 nil 的话就使用 B 的值。”它对可选值特别有用,由于它有效阻止了它们变为可选值,通过提供一个非可选值
B ,这样以来,假如 A 是可选值并且有值,A 就被使用了。假如 A 没有值, B 就被使用(这样我们还是得到了值)。无论如何,我们都有(确定的)值了。
使用下面的代码来实际体验一下:
let album = albumReleased(year: 2006) ?? "unknown"print("The album is \(album)")
“双引号”就是 nil 合并运算符,在上面的代码中,意味着“假如 albumReleased()
返回一个值就赋值给变量 album ,假如返回 nil 就用 unknown
代替”。
现在你观察一下输出窗口,将输出 “The album is Taylor Swift”,没有多余的可选标识(Optional("Taylor Swift")
)。这是由于 Swift 现在能一定可以取得一个确定的值,不是方法返回的值就是你提供的unknown
。这意味着你不需要冒险解包任何东西,可以保证你有确定的数据可用,这使你的代码更安全、更容易使用。
溪石翻译笔记
- 假如将可选值赋值给一个变量,该变量也为可选值
- 强制解包(感叹号)可以取得一个非可选值,但当可选值为 nil 时,会崩溃
英文原文
1. 本站所有资源来源于用户上传和网络,如有侵权请邮件联系站长!
2. 分享目的仅供大家学习和交流,您必须在下载后24小时内删除!
3. 不得使用于非法商业用途,不得违反国家法律。否则后果自负!
4. 本站提供的源码、模板、插件等等其他资源,都不包含技术服务请大家谅解!
5. 如有链接无法下载、失效或广告,请联系管理员处理!
6. 本站资源售价只是摆设,本站源码仅提供给会员学习使用!
7. 如遇到加密压缩包,请使用360解压,如遇到无法解压的请联系管理员
开心源码网 » Swift 可选链 (翻译)