Даунстайлинг в Свифте с тобой?

Какая разница между этими двумя фрагментами кода:

let cell = tableView.dequeueReusableCellWithIdentifier("cellId") as UITableViewCell?
// vs
let cell = tableView.dequeueReusableCellWithIdentifier("cellId") as? UITableViewCell

Не является ли результат точно таким же?

Ответы

Ответ 1

В этом коде нет разницы, в обоих случаях он оценивается как UITableViewCell?

Реальное различие:

  • в первом случае ожидается, что downcast to UITableViewCell? всегда будет успешным (даже если он равен нулю), поэтому, если dequeueReusableCellWithIdentifier возвращает то, что не является экземпляром UITableViewCell (или экземпляром класса унаследованный от него), он не работает во время выполнения. Выражение возвращает необязательный UITableViewCell?

  • во втором случае cast не является обязательным: если объект, возвращаемый dequeueReusableCellWithIdentifier, не является экземпляром UITableViewCell и экземпляром подкласса, down down изящно оценивает значение nil (следовательно, без ошибки времени выполнения).

Конечно, dequeueReusableCellWithIdentifier всегда возвращает UITableViewCell, поэтому нет никакой разницы в вашем коде. Но в других контекстах разница может существовать, и вы должны позаботиться об этом, чтобы предотвратить ошибки времени выполнения.

Ответ 2

Основное различие между as и as? заключается в том, что as принудительно сбрасывается и сбой будет неудачным. as? вернет необязательное значение, содержащее значение, если приведение выполнено успешно, а nil - неудачно.

Ответ 3

Разница между as и as?

  • as? UITableViewCell означает, что когда вы не знаете, что вы downcasting, вы считаете, что в качестве UITableViewCell, но это может быть мне Integer или Float или Array или Dictionary.

  • as UITableViewCell? означает, что он Optional Value, он может содержать либо значение UITableViewCell, либо Nil.