2017-03-01 31 views
0

我试图用guard let语法解开一个可选项。 guard let的目标是打开可选项,如果遇到.none/nil,则中止该过程。Swift3可选的链接和解包错误处理

我以为这意味着一个可选项无法合法地从一个警卫的右侧表达式中返回。但是,如果将两个可选生成的表达式组合到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 
      } 

尝试?关键字会产生一个可选项,就像条件转换运算符那样?如果你改变这两个运营商之一来尝试!或作为!,你会得到预期的结果。

这是预期的行为?我曾假设试图做这样的事情会产生类似于可选链的行为,并且在RHS评估的执行路径的任何地方遇到.none/nil的时候,guard let会执行'else'代码。但是,这似乎并非如此。

这是什么意思,它有一个可选的评估成一个警卫让出的常量/变量?

回答

1

我认为如果你重新排列这个parens它将会起作用。

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

看起来像dup是准确的 – PeejWeej

+0

谢谢。可以证实这一点,但它们对于繁琐的语法是正确的! :)。我的坏消息是 - 谢谢你们! – Cognitio