Swift: "as"-Typumwandlung

kbausd

Mitglied
Thread Starter
Dabei seit
12.10.2014
Beiträge
71
Reaktionspunkte
23
Hallo zusammen,

ich habe ein Verständnisproblem zu folgendem Code:

Code:
override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
        if segue.identifier == "nextView" {
            (segue.destinationViewController as! DetailViewController).detailItem = "Name"
        }

Es bestehen 2 ViewController, "ViewController" und "DetailViewController", beide per segue namens "nextView" verbunden. Dem DetailViewController soll bei Ausführen des Segues ein Name per "detailItem" übergeben werden, der diesen dann anzeigt. Wenn ich es richtig verstehe, werden der Funktion "prepareForSegue" beim Aufruf zwei Objekte übergeben, "segue" und "sender".

Das Objekt "segue" beinhaltet u.a. lt. API Reference die properties "identifier" vom Typ String und "destinationViewController" vom Typ UIViewController. Mir ist nicht ganz klar, was jetzt die property "destinationViewController" genau enthält und warum sie erst in den Typ DetailViewController umgewandelt werden muß, um Zugriff auf "detailItem" zu erhalten. Ist es so, daß zwar ein Objekt von "DetailViewController" enthalten ist, ich aber keinen Zugriff auf "detailItem" habe, weil diese property in der Superklasse UIViewController nicht enthalten ist? Diese wird also sozusagen erst nach Typumwandlung "freigeschaltet"?

Dann verstehe ich nicht, wieso folgendes nicht funktioniert:

Code:
 segue.destinationViewController as! DetailViewController
 segue.destinationViewController.detailItem = "Name"

Das enthaltene Objekt wurde doch in den Typ DetailViewController umgewandelt, wieso kann ich ihn nun nicht über die Punktnotation ansprechen? Oder ist in segue.destinationViewController gar kein Objekt sondern etwas ganz anderes enthalten?

Ich stehe leider grad völlig auf dem Schlauch, für alle Hinweise dankbar!
 
Genau genommen macht die Zeile mit dem as gar nichts.
Du musst das einer Variable zuweisen und mit der kannst Du dann mit der Punktnotation arbeiten.

var x = …
x.property = blubb

Viele Grüße
 
Hmmm, ok, ich habe also folgendes versucht und es klappt tatsächlich:

Code:
var x: DetailViewController
x = (segue.destinationViewController as! DetailViewController)
x.detailItem = "Name"

OK, wenn ich es richtig verstehe wird das Objekt in segue.destinationViewController durch das "as!" nicht selbst umgewandelt sondern der Variablen x einfach in einer anderen Typform zugewiesen.

Also ist
Code:
(segue.destinationViewController as! DetailViewController).detailItem = "Name"
sozusagen die Kurzform von
Code:
let x: DetailViewController = (segue.destinationViewController as! DetailViewController)
x.detailItem = "Name"

Jetzt ist so einiges klar geworden, besten Dank :)
 
Zurück
Oben Unten