2017-03-01 5 views
0

ガードlet構文を使用してオプションのラップを解除しようとしています。ガードletの目的は、オプションをアンラップし、.none/nilに遭遇した場合にプロシージャを中止することです。Swift3エラー処理によるオプションの連鎖とアンラッピング

これは、ガードレットの右側の式からオプションが法的に返されなかったと考えていました。しかし、2つのオプション生成式をRHS式に結合した場合、それらのオプション生成式の1つのみがガードletの目的のために評価されます。例えば、以下のparsedResponse変数は、オプションを保存します:

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

みては?キーワードは条件付きキャスト演算子と同様に?をオプションとして生成します。これらの2つの演算子のいずれかを試してみると!または期待通りの結果を得ることができます。

これは予期された動作ですか?私はこのようなことをしようとすると、オプションの連鎖に似た動作が起こり、RHSの評価の実行パスに沿ってどこでも.none/nilが発生したときにガードletが 'else'コードを実行すると仮定していました。しかし、これは当てはまりません。

ガードletによって導入された定数/変数にオプションの評価を持たせることは、どういう意味ですか?

答えて

1

括弧を並べ替えるとうまくいくと思います。

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

dupのように見えます。 – PeejWeej

+0

ありがとうございます。これを確認できますが、退屈な構文については正しいです! :)。私の悪いことは悪いです - ありがとうございました! – Cognitio

関連する問題