2014-09-26 7 views
15

Jaka jest różnica między tymi dwoma fragmentów kodu:Downcasting w Swift z assem i as?

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

nie wynika dokładnie to samo?

+0

'jak UITableViewCell?' Powoduje błąd kompilacji w Swift 2 'AnyObject? nie można przekształcić w UITableViewCell? ' – onmyway133

Odpowiedz

14

W tym kodzie nie ma różnicy, w obu przypadkach ocenia się UITableViewCell?

Prawdziwa różnica jest:

  • w pierwszym przypadku przygnębiony do UITableViewCell? oczekuje się zawsze uda (nawet jeśli to zero), więc jeśli dequeueReusableCellWithIdentifier zwróci coś, co nie jest instancją UITableViewCell (lub instancją odziedziczonej z niej klasy), kończy się niepowodzeniem w środowisku wykonawczym. Wyrażenie zwraca opcjonalnego UITableViewCell?

  • w drugim przypadku obsada jest opcjonalny: jeżeli obiekt zwrócony przez dequeueReusableCellWithIdentifier jest ani instancją UITableViewCell ani instancją podklasy The przygnębiony wdzięcznie ma wartość zero (stąd bez wykonywania błąd).

Oczywiście dequeueReusableCellWithIdentifier zawsze zwraca UITableViewCell, dlatego nie ma żadnej różnicy w kodzie. Ale w innych kontekstach różnica może istnieć i trzeba dbać o to, aby uniknąć błędów runtime

+1

+1 za wyjaśnienie tego w tak skomplikowany sposób. –

6

Główną różnicą między as i as? że as jest zmuszony obsady i padnie, jeśli powiedzie się. as? zwróci opcjonalną wartość zawierającą wartość, jeśli rzutowanie zakończyło się pomyślnie i nil, jeśli się nie powiedzie.

+0

Czy to oznacza, że ​​'as' i' as! 'Są takie same? –

+0

@ BR41N-FCK To się trochę zmieniło, w Swift 2.0 'as' jest poprawne tylko wtedy, gdy nie ma szansy na niepowodzenie (otrzymasz błąd czasu kompilacji, jeśli użyjesz go, gdy nie jest to dozwolone). 'as!' nazywa się wymuszonym rzutowaniem i ulegnie awarii, jeśli rzutowanie nie będzie możliwe w czasie wykonywania. – Kirsteins

+0

Czy istnieje porównanie tych trzech, aby lepiej zrozumieć niuanse między nimi? –

1

Różnica pomiędzy, as i as?

  • as? UITableViewCell znaczy, kiedy nie wiesz, co downcasting, jesteś przy założeniu, że jako UITableViewCell, ale to może mi Integer lub Float lub Array lub Dictionary.

  • as UITableViewCell? oznacza że jest to Optional Value, może ona zawierać UITableViewCell lub Nil wartość.