Swift3 可选链接和解包错误处理

Swift3 optional chaining and unwrapping with error handling

我正在尝试使用 guard let 语法解包可选。 guard let 的目标是解包可选值,如果遇到 .none/nil 则中止过程。

我原以为这意味着不能从 guard let 右侧的表达式合法返回可选值。但是,如果您将两个可选生成表达式组合到 RHS 表达式中,似乎只有其中一个生成可选表达式被评估用于 guard 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? 也是如此。如果你换这两个运算符中的任何一个试试!或者 as!,你会得到预期的结果。

这是预期的行为吗?我曾假设尝试做这样的事情会产生类似于可选链接的行为,并且 guard let 会在它遇到的那一刻执行 'else' 代码。none/nil 评估执行路径上的任何地方右手。然而,情况似乎并非如此。

将可选的 evaluate 转化为由 guard let 引入的 constant/variable 是什么意思?

我想如果你重新排列括号它会起作用。

guard let parsedResponse = (try? JSONSerialization.jsonObject(with: data, options: .allowFragments)) as? [String:Any] else {