我有一个实现协议的类,以便添加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
}
}
编辑:新屏幕截图
日志
nil
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
结果nil
和else
分支正在执行,这是您的代码所需的全部内容。
唯一误导你的是调试器工具提示还显示被检查对象的其他属性,甚至属性不限于DashboardItem
协议类型的属性,所以包括image: UIImage?
属性以及来自StaticDashboardItem
实际类型对象的任何其他属性。
答案 1 :(得分:1)
您被调试器的工作方式误导了。在您的屏幕截图中,我们在之前暂停您正在检查其值的变量。因此,显示dashboardItem
值的工具提示不一定准确。 dashboardItem
的值对于行之前的行是有效的,而不是在我们暂停的行之后的行。