2015-04-03 104 views
0

我有一个类来实现一个协议,以添加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 
    } 

} 

编辑:新截图enter image description here

日志

nil 
2 

回答

2

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

但是,相反,你又增加,完全无关财产var image: UIImage?StaticDashboardItem,而你不幸把它命名一样的,因此你的困惑。但是您的StaticDashboardItem上的image属性与您的DashboardItem协议中的属性不同,这就是您的困惑所在。

  • 如果您StaticDashboardItemvar image: UIImage?旨在从您的协议,非强制性image属性的实现,那么该类型必须匹配,从而让您的StaticDashboardItem属性必须是类型UIImage,不UIImage?的。
  • 如果您的StaticDashboardItem中的var image: UIImage?旨在成为与协议无关的完全不同的属性,那么您最好使用不同的名称以避免混淆。

[编辑]现在你已经更新了你的问题表现出更多的代码,证实了我的假设。由于您的configure方法中的本地dashboardItem参数被声明为DashboardItem(所以,该协议),则dashboardItem.image指的是协议的属性(因为该代码当然不知道约StaticDashboardItem),它在你的情况不存在(你没有名为imageUIImage类型的dashboardItem你自己反思)解释println结果nilelse分支正在执行,这一切都是预料给你的代码。

是误导你的唯一事情是调试工具提示显示了艾弗里对象的其他属性被检查,甚至没有从DashboardItem协议类型限于那些特性,使包括image: UIImage?财产和其他任何来自StaticDashboardItem真实类型的对象。

+0

是的,这就是为什么我在评论交流中提示他说明'dashboardItem'是如何声明的。现在我们知道(正如我怀疑的那样)它是一个DashboardItem,所以他的代码中的'image'属性是(可选)_protocol_' image'属性,而不是(可选)实例属性。 – matt 2015-04-03 15:58:17

+0

是的,这完全有道理,所以没有Swift的bug,一切都完全合乎逻辑。 – AliSoftware 2015-04-03 16:00:28

+0

另外,他将需要考虑到可选协议成员本身包含在可选项中的事实。这就是为什么他得到“无”;这是_that_可选,它报告“此可选成员未实现。”即使它实现了,他也需要拆开它才能看到图像。如果他将可选成员重写为可选成员,则它将被_double-wrapped_。我的书谈到这个:http://www.apeth.com/swiftBook/ch04.html#SECoptionalProtocol – matt 2015-04-03 16:03:54

1

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

+0

它说nil,看调试器中println的结果。另外,如果让我们去其他部分 – aryaxt 2015-04-03 15:31:53

+0

然后它是零。有什么问题? – matt 2015-04-03 15:32:23

+0

调试器显示一些可选项,所以它不应该为零 – aryaxt 2015-04-03 15:32:52