【问题标题】:Swift try with question markSwift 尝试带问号
【发布时间】:2018-02-28 04:10:47
【问题描述】:

我在我维护的代码中看到以下内容:

func parse(values: NSMutableDicationary) {
    let data = try? JSONSerialization.data(withJSONObject: values, options: JSONSerialization.WritingOptions())
}

注意该方法没有标记为抛出任何东西,也没有处理错误。该代码确实使应用程序崩溃。

我想弄清楚try?(用问号尝试)是什么意思。

谷歌搜索或 StackOverflowing 未返回任何有用信息。

那么,try? 在 Swift 中是什么意思?

【问题讨论】:

  • developer.apple.com/library/content/documentation/Swift/… 中寻找Converting Errors to Optional Values “虽然代码确实使应用程序崩溃”:值为零吗?如果是这种情况,我认为错误不能以这种方式捕获,所以“尝试?”不会做任何事情。
  • 谢谢。我错过了文档中的那部分。
  • 在 iBooks 中打开“The Swift Programming Language”,输入 command-F 表示“Find”和“try?”在搜索字段中。然后你会立即找到答案。

标签: swift exception syntax try-catch


【解决方案1】:

试试?

它返回一个可解包成功值的可选项,并通过返回 nil 来捕获错误。当您尝试仅使用 truefalse 进行发现时,请使用 try?

使用try? 你不能不知道为什么(原因)这会失败。

func parse(values: NSMutableDicationary) {

    //It return only exacat value Data or nil.
    if let data = try? JSONSerialization.data(withJSONObject: values, options: JSONSerialization.WritingOptions()) {
        //Perform operation with data
    }
}

【讨论】:

    【解决方案2】:

    从苹果文档,试试?通过将错误转换为可选值来处理错误。如果在评估尝试时抛出错误?表达式,表达式的值为 nil。

    所以结果是两个之一:

    A.抛出错误,data 为零,尝试使用数据变量是导致崩溃的原因

    B. try? 没有捕捉到抛出的错误,这在出于某种原因运行异步的函数中经常发生

    【讨论】:

      【解决方案3】:

      如果您将带有问号的try 标记为try?,则可抛出函数的返回值将是可选的。如果函数抛出错误,它将是 nil(因此 Swift 返回 nil 而不是抛出错误,因此您不需要 do-catch 块)或者它将是函数的包装返回值如果没有抛出错误。

      这是您可以在自己的函数中模仿行为的方法:

      func parse(values: NSMutableDicationary)->Data?{
          do {
              return try JSONSerialization.data(withJSONObject: values, options: JSONSerialization.WritingOptions())
          } catch {
              return nil
          }
      }
      

      这与以下内容基本相同:

      func parse(values: NSMutableDicationary)->Data?{
          return try? JSONSerialization.data(withJSONObject: values, options: JSONSerialization.WritingOptions())
      }
      

      【讨论】:

      • 绝对有道理。感谢您的快速回答,我不知道我是如何错过 Apple 的相关文档的。
      猜你喜欢
      • 1970-01-01
      • 2022-12-09
      • 2014-07-30
      • 1970-01-01
      • 2017-02-13
      • 2016-05-25
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多