展开可选项
为了访问 Optional 的值,需要将其解包。
你可以使用可选绑定有条件地打开 Optional,并使用 !
操作符强制打开 Optional。
有条件地展开有效地询问“这个变量是否有价值?” 虽然强行展开说“这个变量有价值!”。
如果你强制打开一个 nil
变量,程序将在解开可选异常并崩溃时抛出意外发现的 nil ,因此你需要仔细考虑是否使用 !
。
var text: String? = nil
var unwrapped: String = text! //crashes with "unexpectedly found nil while unwrapping an Optional value"
为了安全展开,你可以使用 if-let
语句,如果包装的值为 nil
,则不会抛出异常或崩溃:
var number: Int?
if let unwrappedNumber = number { // Has `number` been assigned a value?
print("number: \(unwrappedNumber)") // Will not enter this line
} else {
print("number was not assigned a value")
}
或者,一份警卫声明 :
var number: Int?
guard let unwrappedNumber = number else {
return
}
print("number: \(unwrappedNumber)")
请注意,unwrappedNumber
变量的范围在 if-let
语句内,在 guard
块之外。
你可以链接展开许多可选项,这在代码需要更多变量才能正确运行的情况下非常有用:
var firstName:String?
var lastName:String?
if let fn = firstName, let ln = lastName {
print("\(fn) + \(ln)")//pay attention that the condition will be true only if both optionals are not nil.
}
请注意,为了成功通过测试,必须解开所有变量,否则你将无法确定哪些变量被解包而哪些变量未被解包。
你可以在解包后立即使用你的选项链接条件语句。这意味着没有嵌套的 if - else 语句!
var firstName:String? = "Bob"
var myBool:Bool? = false
if let fn = firstName, fn == "Bob", let bool = myBool, !bool {
print("firstName is bob and myBool was false!")
}