Swift 3 种更好的解包可选的方法

Swift 3 better way to unwrap an optional

现在我有一些代码如下所示:

let msg: String? = myStr.removingPercentEncoding ?? nil

print("msg \(msg!)")

我真的不喜欢在 msg! 中使用 !,因为我相信这可能会引发异常。

如果 myStr 不为 nil 然后在不抛出异常的情况下解包 msg,调用 myStr.removingPercentEncoding 的最佳方法是什么?

正确的方法是:

if let msg = myStr.removingPercentEncoding {
    print("msg \(msg)")
}

此处,msg 仅在 if 语句内有效且仅当 myStr.removingPercentEncoding 不是 nil.

如果 myStr.removingPercentEncodingnil,如果你想打印一些东西,那么你可以 else:

if let msg = myStr.removingPercentEncoding {
    print("msg \(msg)")
} else {
    print("msg has no value")
}

阅读 Optional Binding in the The Swift Programming Language 本书。

这一行完全没用,当myStr.removingPercentEncodingnil时,那么nil??右边)赋值给msg

let msg: String? = myStr.removingPercentEncoding ?? nil

为什么不把它改成:

let msg: String = myStr.removingPercentEncoding ?? ""

print("msg \(msg)")