条件绑定的初始化程序必须具有可选类型

时间:2016-12-08 19:32:27

标签: ios swift carekit

我不明白为什么我会收到此错误。我没有看到代码有任何问题。请帮忙!!谢谢!

      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)
        }
    }
}

}

2 个答案:

答案 0 :(得分:1)

语法

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

当等号两边的变量名相同时起作用。

然而,代码

guard let someVal = someVal else {
  return
}

不合法。我相信第一种形式if let条件绑定允许您使用相同名称解包可选项的原因是重新分配仅在由if语句的大括号创建的范围的内部级别内有效。< / p>

相比之下,当可选的展开成功时,guard语句不会在执行的代码周围添加大括号。 someVar的新定义无效,内部范围没有。

它的第二部分是听起来symptomTrackerViewController不是可选的。如果symptomTrackerViewController不是可选的,那么任何尝试解包它的代码(if letguard let以及使用?!)都将失败。

答案 1 :(得分:0)

symptomTrackerViewControllersymptomTrackerViewController.lastSelectedAssessmentEvent不是可选的。

  1. 检查您的symptomTrackerViewController是否可选。如果它不是可选的,它永远不会是零,所以你可以将它从守卫中移除。

  2. 尝试更换后卫

    警告让症状跟踪VSC =症状跟踪控制器, let event = symptomTrackerViewController.lastSelectedAssessmentEvent 别的{return}

  3. 当您使用if let something = somethingElse时, somethingElse必须是可选的。