guard let:条件绑定的初始化程序必须是可选类型而不是' ClassName'

时间:2017-02-04 03:11:43

标签: ios swift3

我正在我的应用的tableviewcontroller之一中实施静态vc。我在此cartManager中将vc定义为:

  var cartManager: ShoppingCartManager {
    didSet {
        self.tableView.reloadData()
    }
}

configureCell是我定义单元格配置的地方。 但是,我在以下函数中的guard let statement上收到错误。 我似乎不知道为什么会出现这个错误。

override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    guard let cartManager = cartManager else {
        return UITableViewCell()
    }
    if (indexPath.row < cartManager.distinctProductCount()) {
        let cell = tableView.dequeueReusableCell(withIdentifier: myCartProduct, for: indexPath) as? CartTableViewCell
        cell.configureCell(item: cartManager.distinctProductItems()[indexPath.row])
        return cell!
    }
    else if (indexPath.row == cartManager.distinctProductCount()) {
        let cell = tableView.dequeueReusableCell(withIdentifier: myCartTotal, for: indexPath) as? CartTotalTableViewCell
        cell.configureCell(total: cartManager.totalPrice())
        return cell!
    }
    let cell = tableView.dequeueReusableCell(withIdentifier: submitCart, for: indexPath) as? CartPlaceOrderTableViewCell
    cell.configureCell(cartManager: cartManager)
    cell?.delegate = self
    return cell!
}

我的numberOfRowsInSection方法也是如此。 numberOfRowsInSection函数的代码在这里:

  override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {

    guard let cartManager = cartManager else {
        return 0
    }

    return cartManager.distinctProductCount() + 2
}

我是否正确使用guard let语句,或者还有其他方法可以使用该语句?

2 个答案:

答案 0 :(得分:1)

guard let x = x表示第二个x是一个可选项,我们正在尝试解包它以获取内部的任何内容。如果“可选”为nil,则表示我们失败并且guard失败并退出。如果Optional不是nil,我们就会成功,第一个x会成为Optional中包含的内容。

您无法使用cartManager执行此操作,因为它不是可选项。

答案 1 :(得分:0)

好的,我在命中和试验的基础上找到了解决方案,因为我对cartManager定义进行了条件绑定。这是解决方案。

    var cartManager: ShoppingCartManager? {
        didSet {
        self.tableView.reloadData()
        }
}