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.removingPercentEncoding
是nil
时打印一些东西,那么您可以和else
:
if let msg = myStr.removingPercentEncoding
print("msg \(msg)")
else
print("msg has no value")
在The Swift Programming Language 书中阅读Optional Binding。
【讨论】:
【参考方案2】:这一行完全没用,当myStr.removingPercentEncoding
是nil
,那么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 更好的方式来解开一个可选的的主要内容,如果未能解决你的问题,请参考以下文章
For-in 循环需要“[UserVehicles]?”符合“顺序”;你的意思是解开可选的吗?迅速