2016-06-08 61 views
2

編輯:可選綁定函數與可選鏈接有什麼不同?

我正在從Raywenderlich的教程學習。我的問題是爲什麼我們使用可選綁定,即if let它有什麼不同?爲什麼我們不能使用可選的鏈接 - 類似於A行& B?

func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell { 
    let cell = tableView.dequeueReusableCellWithIdentifier("IconCell", forIndexPath: indexPath) 
    let icon = icons[indexPath.row] 

    cell.textLabel?.text = icon.title // Line A 
    cell.detailTextLabel?.text = icon.subtitle // Line B 

    if let imageView = cell.imageView, iconImage = icon.image { //Line C 
     imageView.image = iconImage 
    } 

教練的解釋是:

當我們實例中,我們得到基於字符串的圖像的引用的圖標...如果出於某種原因,圖像不包含在捆綁,重新命名或刪除,那麼該圖標可能沒有與之相關的圖像...我們必須使用,如果讓它確保它在那裏。

我還是不明白區別。

+1

綁定讓你有一個else語句。除此之外,我沒有看到你的情況有重大區別 – Jared

+0

@Jared就是這樣嗎?如果你不把任何東西放在else語句中,那麼它有什麼好處嗎? – Honey

+0

也在if語句中不再需要可選鏈。所以它對於多行代碼很有用。除此之外,並沒有真正的優勢 – Jared

回答

5

如果你正在考慮的

cell.imageView?.image = icon.image // let's call this Line D 

這是相當於線下

如果cell.imageView不比零,而icon.image是零,線d將刪除的原始圖像將imageView設置爲nil。

但是,在C行不會輸入條件,從而保留原始圖像,即使icon.image爲零。

線C相當於

if let image = icon.image { 
    cell.imageView?.image = image 
} 

我猜你的教授只是想使之更加明確。

+0

不會A行,B也擦除,如果他們是零?爲什麼不用'如果讓'來寫呢?另外'cell.imageView'如何不是零?這只是在這裏設置,這意味着它肯定是'無' – Honey

+0

@Honey:(1)是的,他們會。但是你需要檢查圖標類型的聲明,它們可能被聲明爲'String'而不是'String?'。 (2)如果您正在使用故事板,則在將單元格連接到界面構建器中的圖像視圖時會分配「cell.imageView」。 – kennytm

+0

** 1)** C行如何讀取?它是這樣讀取的:*如果cell.imageView不是零,而icon.image也不是零,則使imageView.image等於icon.Image即iconImage *? ** 2)**爲什麼我們關心'cell.ImageView'的值,我的意思是我們要將它設置爲'icon.image',而不管它是否有值。我們只在乎'icon.image'是否有值。如果它是零,那麼我們不想設置它... – Honey