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