2016-12-08 9 views
0

なぜこのエラーが発生するのか分かりません。私はコードに間違いがないとは思わない。助けてください!!ありがとう!条件付きバインドの初期設定にはオプションの型が必要です

 guard reason == .completed else { return } 
***guard let symptomTrackerViewController = symptomTrackerViewController***, 
let event = symptomTrackerViewController.lastSelectedAssessmentEvent else { return } 


let carePlanResult=carePlanStoreManager.buildCarePlanResultFrom(taskResult: taskViewController.result) 

    carePlanStoreManager.store.update(event, with: carePlanResult, state: .completed) { 
     success, _, error in 
     if !success { 
      print(error?.localizedDescription) 
     } 
    } 
} 

}

+0

このエラーが発生している行を表示できますか? – JPetric

+0

これは奇妙です: 'guard let symptomTrackerViewController = symptomTrackerViewController' - なぜ' symptomTrackViewController'を同じ変数に展開しませんか?それは意味をなさない。 私の推測: 'symptomTrackerViewController'または' symptomTrackerViewController.lastSelectedAssessmentEvent'はオプションではありません(少なくとも1つはゼロにすることはできません) – Randy

+0

それではどうなりますか?あなたの意見では –

答えて

0

symptomTrackerViewController又はsymptomTrackerViewController.lastSelectedAssessmentEventいずれオプションではありません。

  1. symptomTrackerViewControllerがオプションであることを確認してください。オプションでない場合、ガードから削除することはできません。

  2. ガードにガードを変更してみてくださいsymptomTrackerVC = symptomTrackerViewController、 LETイベントを聞かせて= symptomTrackerViewController.lastSelectedAssessmentEvent他 {リターン}あなたがif let something = somethingElseを使用している

は、 somethingElseはオプションでなければなりません。

1

構文

if let someVal = someVal { 
    //Inside the braces someVal is unwrapped 
} 

ワークス変数名は、等号の両側で同じです。

しかし、コード

guard let someVal = someVal else { 
    return 
} 

は合法ではありません。私は最初の形式、if let条件付きバインディングは、同じ名前を使用してオプションをアンラップできる理由は、再割り当ては、ifステートメントの中括弧で作成されたスコープの内部レベル内でのみ有効であると考えています。

対照的に、ガードステートメントでは、オプションのアンラッピングが成功したときに実行されるコードの周囲にカッコを入れません。 someVarの新しい定義が有効な内部スコープはありません。

2番目の部分は、あなたのsymptomTrackerViewControllerはオプションではないようです。 symptomTrackerViewControllerがオプションでない場合、コードをアンラップしようとするコード(if letguard let?および!を使用)は失敗します。

関連する問題