0

我正在尝试使用 guard let 语法来解开一个可选的。使用 guard let 的目的是解开可选项,如果遇到 .none/nil 则中止该过程。

我原以为这意味着一个可选的不能从一个守卫的右边的表达式合法地返回。但是,如果将两个产生可选的表达式组合到 RHS 表达式中,似乎只有一个产生可选的表达式会被评估以用于保护 let 的目的。例如,下面的 parsedResponse 变量将存储一个可选的:

guard let parsedResponse = try? (JSONSerialization.jsonObject(with: data, options: .allowFragments) as? [String:Any]) else {
                displayError(withString: "Error parsing data as JSON")
                return
            }

试试?关键字产生一个可选项,条件转换运算符 as? 也是如此。如果你改变这两个运算符中的任何一个来试试!或作为!,您会得到预期的结果。

这是预期的行为吗?我曾假设尝试做这样的事情会产生类似于可选链接的行为,并且当它在 RHS 评估的执行路径上的任何地方遇到 .none/nil 时,守卫 let 将执行“else”代码。然而,情况似乎并非如此。

将一个可选的评估值转换为一个由守卫引入的常量/变量意味着什么?

4

1 回答 1

1

我认为如果您重新排列括号,它将起作用。

guard let parsedResponse = (try? JSONSerialization.jsonObject(with: data, options: .allowFragments)) as? [String:Any] else {
于 2017-03-01T18:42:22.513 回答