我有一个实现协议的类,以便添加3个变量。我专门设置了图像变量,调试器显示变量存在,但是在代码中,当我打印它时它显示为零,我的if let语句也认为变量是零。
@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发布于 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真实类型的任何其他属性。
发布于 2015-04-03 15:30:22
调试器的工作方式误导了您。在屏幕截图中,我们在您正在检查的变量之前暂停。因此,显示dashboardItem值的工具提示不一定准确。dashboardItem的值对于暂停的行之前的行是有效的,对于暂停的行之后的行是有效的。
https://stackoverflow.com/questions/29435069
复制相似问题