我试图使用guard let语法解包一个可选项。警卫let的目标是打开选项,如果遇到.none / nil则中止程序。
我原以为这意味着一个选项不能合法地从一个守卫右手边的表达式返回。但是,似乎如果将两个可选生成表达式组合到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
}
试试? keyword生成一个可选项,条件转换运算符也是如此。如果您更改这两个运算符中的任何一个尝试!或者作为!,你得到预期的结果。
这是预期的行为吗?我曾经假设尝试做类似这样的事情会产生类似于可选链接的行为,并且后卫会在它遇到的时刻执行'else'代码.none / nil在RHS评估的执行路径上的任何地方。但是,情况似乎并非如此。
将一个可选的值计算到一个由守护程序引入的常量/变量中甚至意味着什么?
答案 0 :(得分:1)
我认为如果你重新排列它会起作用。
guard let parsedResponse = (try? JSONSerialization.jsonObject(with: data, options: .allowFragments)) as? [String:Any] else {