Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How does optional binding function different from optional chaining? [closed]

EDITED:

I am learning from a tutorial from Raywenderlich. My question is why do we use an optional binding ie if let what difference does it make? Why can't we use optional chaining—similar to Line 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
    }

The instructor's explanation is :

When we instance an icon we get a reference to the image based on a string...if for whatever reason that image isn't included in the bundle, renamed or deleted, then that icon may not have an image associated with it...and we have to use if let to make sure it is there.

I still don't understand the difference.

like image 925
mfaani Avatar asked Mar 12 '23 01:03

mfaani


1 Answers

If you are thinking of

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

this is not equivalent to Line C.

If cell.imageView is not-nil, while icon.image is nil, line D will erase the original image of the imageView by setting it to nil.

However, in line C the condition will not be entered, thus keeping the original image even if icon.image is nil.

Line C is equivalent to

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

I guess your professor just like to make it more explicit.

like image 84
kennytm Avatar answered Apr 26 '23 09:04

kennytm