【问题标题】:Swift 3 better way to unwrap an optionalSwift 3 更好的方式来解开一个可选的
【发布时间】: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 编写的。

标签: swift optional optional-binding


【解决方案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--。我认为大多数读者可以为"" 选择自己的替代值。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多