Swift解开可选

示例

为了访问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是假的!")
}