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

时间:2015-04-03 15:26:28

标签: ios swift

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

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

}

编辑:新屏幕截图enter image description here

日志

nil
2

2 个答案:

答案 0 :(得分:2)

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

但相反,您已将另一个完全不相关的属性var image: UIImage?添加到您的StaticDashboardItem,并且您遗憾地给了它相同的名称,因此您感到困惑。但是,image上的StaticDashboardItem属性与您DashboardItem协议中的属性{1}和您的混淆来源不同。

  • 如果您的var image: UIImage?中的StaticDashboardItem旨在从您的协议中实现该非强制性image属性,那么这些类型必须匹配,以便您StaticDashboardItem的属性1}}必须是UIImage类型,而不是UIImage?
  • 如果var image: UIImage?中的StaticDashboardItem与您的协议无关,那么您最好使用其他名称以避免混淆。

[编辑]现在你已经更新了你的问题,以显示更多证实我的假设的代码。由于dashboardItem方法中的本地configure参数被声明为DashboardItem(因此,协议),因此dashboardItem.image指的是协议的属性(如该代码当然不知道StaticDashboardItem,它只知道协议),在您的情况下不存在(您没有类型为image的{​​{1}}属性UIImage您正在反思的dashboardItem解释println结果nilelse分支正在执行,这是您的代码所需的全部内容。

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

答案 1 :(得分:1)

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