有时使用可选类型会感到有些笨拙,并且所有解包和检查工作都变得如此繁重,以至于您可能会想起一些感叹号来强制展开内容,以便继续工作。但是请注意:如果您强制拆开没有值的可选选项,则代码将崩溃。
Swift有两种技术可以帮助您减少代码的复杂度。第一个称为可选链,它使您仅在可选具有值时才运行代码。将以下代码放入您的 playground 以开始我们的工作:
代码语言:javascript复制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”),则可以调用该字符串的uppercased()
方法。例如:
let str = "Hello world"
print(str.uppercased())
问题是,albumReleased()
返回一个可选字符串:它可能返回一个字符串,或者可能什么都不返回。因此,我们真正的意思是,“如果返回字符串,则将其变为大写,否则不执行任何操作。”这就是可选链接出现的地方,因为它恰好提供了该行为。
尝试将最后两行代码更改为这样:
代码语言:javascript复制let album = albumReleased(year: 2006)?.uppercased()
print("The album is (album)")
请注意,那里有一个问号,这是可选的链接:问号之后的所有内容仅在问号之前的所有内容都具有值时才运行。这不会影响album
的基础数据类型,因为该行代码现在将返回nil
或将返回大写相册名称——它仍然是可选字符串。
您的可选链可以根据您的需要而定,例如:
代码语言:javascript复制let album = albumReleased(year: 2006)?.someOptionalValue?.someOtherOptionalValue?.whatever
Swift将从左至右检查它们,直到找到nil
,然后停止。
空合运算符 Nil Coalescing Operator : ??
这个简单的Swift功能使您的代码更简单,更安全,但名字如此夸张,以至于很多人对此感到恐惧。真可惜,因为如果您花时间弄清楚空合运算符,将使您的生活更轻松!
它的作用是让您说“如果可以,请使用值A,但如果值A为nil,则请使用值B。”就是这样。这对于可选项特别有用,因为它可以有效地阻止它们成为可选项,因为您提供了非可选值B。因此,如果A是可选项并且具有值,则它会被使用(我们有一个值)。没有值,B被使用(所以我们仍然有一个值)。无论哪种方式,我们绝对都有值。
为了给您一个真实的上下文,请尝试在 playground 上使用以下代码:
代码语言:javascript复制let album = albumReleased(year: 2006) ?? "unknown"
print("The album is (album)")
这个双重问号是空合运算符,在这种情况下,它的意思是“如果albumReleased()
返回一个值,然后将其放入album
变量,但是如果albumReleased()
返回nil
,则使用'unknown'。
如果现在在结果窗口中查看,您会看到其中印有"The album is Taylor Swift''的标签——没有更多的可选选项。这是因为Swift现在可以确定它会返回真实值,或者是因为该函数返回了一个值,或者是因为您提供的是“ unknown”。反过来,这意味着您不需要拆开任何可选值或面临发生崩溃的风险——确保可以使用确实存在的数据,这使您的代码更安全,更容易使用。
本文来自Hacking with Swift给swift初学者的入门课程Swift for Complete Beginners 的Optional chaining