2014-09-26 4 views
15

Was ist der Unterschied zwischen diesen beiden Code-Snippets ist:Downcasting in Swift mit as und as?

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

ist nicht das Ergebnis genau das gleiche?

+0

'als UITableViewCell?' Führt zu Kompilierungsfehler in Swift 2 'AnyObject? ist nicht umwandelbar in UITableViewCell? ' – onmyway133

Antwort

14

In diesem Code kein Unterschied ist, in beiden Fällen wertet es UITableViewCell?

Der wirkliche Unterschied ist:

  • im ersten Fall ein niedergeschlagenen zu UITableViewCell? erwartet wird, immer erfolgreich (auch wenn Wenn dequeueReusableCellWithIdentifier etwas zurückgibt, das keine Instanz von UITableViewCell ist (oder eine Instanz einer davon geerbten Klasse), schlägt es zur Laufzeit fehl. Der Ausdruck gibt eine optionales UITableViewCell?

  • im zweiten Fall die Besetzung ist optional: wenn das Objekt zurückgegeben durch dequeueReusableCellWithIdentifier ist weder eine Instanz von UITableViewCell noch eine Instanz einer Unterklasse, die niedergeschlagenen auswertet ordnungsgemäß auf Null (also ohne Laufzeit Error).

Natürlich dequeueReusableCellWithIdentifier gibt immer einen UITableViewCell, deshalb in Ihrem Code keinen Unterschied gibt. Aber in anderen Kontexten kann der Unterschied bestehen und Sie müssen sich darum kümmern, um Laufzeitfehler zu vermeiden.

+1

+1 für die Erklärung in einer so aufwendigen Art und Weise. –

6

Der Hauptunterschied zwischen as und as? ist, dass as gezwungen wird zu werfen und wird abstürzen, wenn nicht erfolgreich. as? gibt den optionalen Wert zurück, der den Wert enthält, wenn die Umwandlung erfolgreich war, und nil, falls nicht erfolgreich.

+0

Bedeutet das, dass 'as' und' as! 'Gleich sind? –

+0

@ BR41N-FCK Dies hat sich ein wenig geändert, in Swift 2.0 'as' ist nur gültig, wenn keine Fehlermöglichkeit besteht (Sie erhalten einen Kompilierzeitfehler, wenn Sie ihn verwenden, wenn er nicht erlaubt ist). 'as!' wird als erzwungenes Casting bezeichnet und stürzt ab, wenn die Umwandlung zur Laufzeit nicht möglich ist. – Kirsteins

+0

Gibt es einen Vergleich der drei, um die Nuancen zwischen ihnen besser zu verstehen? –

1

Der Unterschied zwischen, as und as?

  • as? UITableViewCell bedeutet, wenn Sie nicht wissen, was Sie downcasting, Sie gehen davon aus, dass als UITableViewCell, aber es könnte mir Integer oder Float oder Array oder Dictionary.

  • as UITableViewCell? bedeutet, es ist ein Optional Value, es entweder eine oder UITableViewCellNil Wert enthalten.