快速尝试问号

时间:2017-09-19 11:32:35

标签: swift exception syntax try-catch

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

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

注意该方法不会标记为抛出任何内容,也不会处理错误。代码确实使应用程序崩溃。

我试图找出try?(尝试使用问号)的含义。

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

那么,try?在Swift中意味着什么?

3 个答案:

答案 0 :(得分:10)

如果您将try标记为try?,则throwable函数的返回值将是可选的。如果函数抛出错误,那么它将为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())
}

答案 1 :(得分:2)

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

结果是两个中的一个:

一个。抛出错误,data为零,尝试使用数据变量导致崩溃

B中。 try?没有捕获抛出的错误,由于某种原因在异步运行的函数中发生了很多错误

答案 2 :(得分:2)

<强>尝试吗

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

时,请使用false

使用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
    }
}