首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >变量不是零,但是代码认为它是零

变量不是零,但是代码认为它是零
EN

Stack Overflow用户
提问于 2015-04-03 15:26:27
回答 2查看 134关注 0票数 0

我有一个实现协议的类,以便添加3个变量。我专门设置了图像变量,调试器显示变量存在,但是在代码中,当我打印它时它显示为零,我的if let语句也认为变量是零。

代码语言:javascript
复制
@objc protocol DashboardItem {

    var title: String { get }
    var detail: String { get }
    optional var image: UIImage { get }

}

class StaticDashboardItem: DashboardItem {

    var title: String
    var detail: String
    var image: UIImage?

    init(title: String, detail: String, image: UIImage) {
        self.title = title
        self.detail = detail
        self.image = image
    }

}

编辑:新的截图

日志

代码语言:javascript
复制
nil
2
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-04-03 15:54:13

您的StaticDashboardItem没有完全实现DashboardItem协议。它符合它,但不实现var image: UIImage { get }变量,他完全有权不实现该变量,因为这种一致性是optional。因此,您的StaticDashboardItem没有来自该协议的任何属性/变量image

但是,相反,您已经向您的添加了另一个完全无关的 property var image: UIImage?到您的StaticDashboardItem中,不幸的是您给它取了相同的名称,从而导致您的混淆。但是,您的StaticDashboardItem上的属性StaticDashboardItem与您的DashboardItem协议中的属性不一样,这就是您的困惑之处所在。

  • 如果来自您的var image: UIImage?StaticDashboardItem要实现协议中的非强制性image属性,那么类型必须匹配,因此来自StaticDashboardItem的属性必须是UIImage类型,而不是UIImage?类型。
  • 如果来自您的var image: UIImage?StaticDashboardItem是一个与您的协议无关的完全不同的属性,那么最好使用不同的名称来避免混淆。

现在编辑您的问题,以显示更多的代码,以证实我的假设。由于您的configure方法中的本地configure参数被声明为DashboardItem (所以,协议),那么dashboardItem.image引用协议的属性(因为该代码当然不知道StaticDashboardItem,它只知道协议),在您的示例中不存在该协议(您在dashboardItem中没有UIImage类型的image属性),说明println结果< code >D38和else分支正在执行,这在您的代码中都是预期的。

唯一误导您的是调试器工具提示,它还显示被检查对象的其他属性,甚至不限于来自DashboardItem协议类型的属性,包括image: UIImage?属性和来自对象的StaticDashboardItem真实类型的任何其他属性。

票数 2
EN

Stack Overflow用户

发布于 2015-04-03 15:30:22

调试器的工作方式误导了您。在屏幕截图中,我们在您正在检查的变量之前暂停。因此,显示dashboardItem值的工具提示不一定准确。dashboardItem的值对于暂停的行之前的行是有效的,对于暂停的行之后的行是有效的。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/29435069

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档