What's the difference between these two code snippets:
let cell = tableView.dequeueReusableCellWithIdentifier("cellId") as UITableViewCell?
// vs
let cell = tableView.dequeueReusableCellWithIdentifier("cellId") as? UITableViewCell
Isn't the result exactly the same?
In that code there's no difference, in both cases it evaluates to UITableViewCell?
The real difference is:
in the first case a downcast to UITableViewCell?
is expected to always succeed (even if it's nil), so if dequeueReusableCellWithIdentifier
returns something that's not an instance of UITableViewCell
(or an instance of a class inherited from it), it fails at runtime. The expression returns an optional UITableViewCell?
in the second case the cast is optional: if the object returned by dequeueReusableCellWithIdentifier
is neither an instance of UITableViewCell
nor an instance of a subclass, the downcast gracefully evaluates to nil (hence with no runtime error).
Of course dequeueReusableCellWithIdentifier
always returns a UITableViewCell
, that's why there's no difference in your code. But in other contexts the difference may exist and you have to take care of that to prevent runtime errors
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With