2017-03-01 49 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