2015-04-03 107 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