【问题标题】:Swift "guard let" unwrap failedSwift“守卫让”解包失败
【发布时间】:2016-04-22 11:00:22
【问题描述】:

无法使用 Swift 2.2、Xcode 版本 7.3 (7D175) 解包可选类型

“守卫让”失败

但是“guard var”有效

请帮忙! 这是怎么回事?

EDIT1

    let localPresenter = presenter
    let localDataSource = dataSource
    let configurator: ViewControllerConfigurator = { inputView in
        let a = inputView as? ChatTableViewController
        guard var chatListController = a else {
            throw ApplicationErrors.ModuleConfigureError.WrongViewInput
        }
        localPresenter.view = chatListController
        chatListController.presenter = localPresenter
        chatListController.tableView.dataSource = localDataSource
    }

EDIT2 此代码工作正常:

        let localPresenter = presenter
        let localDataSource = dataSource
        let configurator: ViewControllerConfigurator = { inputView in
            let a = inputView as? ChatTableViewController
            if let chatListController = a {
                localPresenter.view = chatListController
                chatListController.presenter = localPresenter
                chatListController.tableView.dataSource = localDataSource
            } else {
                throw ApplicationErrors.ModuleConfigureError.WrongViewInput
            }
        }

【问题讨论】:

  • 请同时包含您的代码作为文本(使用edit按钮)。
  • 很抱歉,我无法创建简单的示例项目。
  • @EricD 谢谢,我知道,但问题不在于断点。我不明白为什么 guard 可以很好地解包变量,但不能解包常量?
  • @EricD 谢谢你用断点指向我。

标签: xcode swift var guard let


【解决方案1】:

看起来这是 lldb 中的错误。 如果我用“guard”在行上设置断点,那么“guard”会失败:

但是,如果我将此断点移过保护块,则代码可以正常工作:

【讨论】:

  • 这不是错误,而是它的工作原理。 :) 断点是一个障碍,一个停止标志:执行运行直到遇到断点,所以如果你把停止放在一行,应用程序会暂停就在这一行之前.
  • 我很抱歉,但是为什么当我设置断点时代码会失败?读什么关于他的行为?我知道过去的断点是一个 IRQ,用于在指令上停止 CPU,但看起来这里发生了一些与寄存器值有关的事情,因此代码工作错误。不是吗?
  • 在物理学中称为“观察者效应”。
  • @adnako 你试过不使用断点而是使用print 语句吗?
  • 我想查看程序状态的全貌,print 语句用于简单的日志记录。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2022-06-21
  • 2012-01-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多