为了访问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 { // 编号是否已分配值? print("number: \(unwrappedNumber)") // 不会进入此行 } 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)")//请注意,只有两个可选参数都不为零时,条件才为true。 }
请注意,必须解开所有变量才能成功通过测试,否则,您将无法确定哪些变量已解开,哪些变量未解开。
展开包装后,您可以立即使用可选选项链接条件语句。这意味着没有嵌套的if-else语句!
var firstName:String? = "Bob" var myBool:Bool? = false if let fn = firstName, fn == "Bob", let bool = myBool, !bool { print("名字是鲍勃,而myBool是假的!") }