Swift 3 更好的方式来解开一个可选的

Posted

技术标签:

【中文标题】Swift 3 更好的方式来解开一个可选的【英文标题】:Swift 3 better way to unwrap an optional 【发布时间】:2017-01-04 16:56:29 【问题描述】:

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

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

print("msg \(msg!)")

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

如果 myStr 不是 nil 则调用 myStr.removingPercentEncoding 的最佳方法是什么,然后在不引发异常的情况下解开 msg?

【问题讨论】:

请注意,?? nil 在这种情况下是完全多余的。 默认情况下,removingPercentEncoding 返回一个可选字符串。应该是:let msg = myStr.stringByRemovingPercentEncoding @AhmadF stringByRemovingPercentEncoding 是旧的 Swift 语法 @shim 是的,它是 Swift 2,它返回 String? @AhmadF 是的,请仔细阅读这个问题。它是用 Swift 3 编写的。 【参考方案1】:

正确的方法是:

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")

在The Swift Programming Language 书中阅读Optional Binding。

【讨论】:

【参考方案2】:

这一行完全没用,当myStr.removingPercentEncodingnil,那么nil?? 的右手边)被分配给msg

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

你为什么不把它变成:

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

print("msg \(msg)")

【讨论】:

根据用例,可能更希望使用let msg = myStr.removingPercentEncoding ?? myStr,因为看到完整的无效百分比编码字符串可能比什么都看不到更有用。 @Hamish,一个可能的选项,但取决于用例。在某些情况下,所需的输出可能类似于msg --invalid input--。我认为大多数读者可以为"" 选择自己的替代值。

以上是关于Swift 3 更好的方式来解开一个可选的的主要内容,如果未能解决你的问题,请参考以下文章

关于swift中的可选类型

For-in 循环需要“[UserVehicles]?”符合“顺序”;你的意思是解开可选的吗?迅速

Swift之深入解析如何处理非可选的可选项类型

在 swift 4.0 中从 firebase 快照字典中获取值时打开一个可选的 nil

Swift5.4 中可选的误报

Swift、Core Data、可选的 Integer16 和 keyPath