Verständnisfrage zu Optionals in Swift

K

Klaber

Mitglied
Thread Starter
Dabei seit
14.09.2016
Beiträge
45
Reaktionspunkte
16
Hallo,

ich arbeite mich derzeit in Swift ein und mir ist soweit das Prinzip der Optionals verständlich.

Mir ist derzeit nur nicht ganz klar, warum Optionals bzgl. UIKit geprüft werden müssen. Als Beispiel mal folgender Codeschnipsel:

Code:
    @IBAction func button1(_ sender: CustomButton) {
        guard let image = imageView.image else { return }
        let activityController = UIActivityViewController(activityItems: [image], applicationActivities: nil)
        activityController.popoverPresentationController?.sourceView = sender
        present(activityController, animated: true, completion: nil)

Hier wird, wenn ich es richtig verstanden habe, per guard geprüft ob die optinale property "imageView.image" einen Wert hat oder nicht. Wenn ja, wird dieser "image" zugewiesen ansonsten erfolgt ein return.

Mir kam die Idee, daß man dies doch per force unwrap vereinfachen könnte, also:

Code:
    @IBAction func button1(_ sender: CustomButton) {
        let activityController = UIActivityViewController(activityItems: [imageView.image!], applicationActivities: nil)
        activityController.popoverPresentationController?.sourceView = sender
        present(activityController, animated: true, completion: nil)


Der Compiler akzeptiert dies und das Programm funktioniert auch.

Mir ist aber bewußt das dies wohl nicht der richtige Weg ist. Aber warum? In diesem Beispiel ist die property imageView.image definitiv gesetzt. Was für Beispiele gibt es, in denen die property nicht gesetzt ist?

Danke!

Klaus
 
Hallo und frohe Weihnachten.
Das Besondere an Swift ist ja, dass Variable immer deklariert und auch initialisiert werden müssen. Da es aber sein kann, dass Variable erst zur Laufzeit gesetzt werden vom z.B. Anwender eines Programm, wurden die Optionals erfunden. Sie erlauben die Angabe(Deklaration) einer Variable ohne Wertzuweisung(Initialisierung), sie sind eben Optional.

Beide Varianten von Dir oben laufen, trotzdem ist die erste Variante besser, weil sie eben überprüft ob wirklich ein Wert initialisiert wurde. Swift erlaubt ein nil, also nichts. Und nichts ist eben nichts.
Deine Funktion von oben weist dem Controller ein Bild zu und prüft ob wirklich ein Bild angeben wurde. Setz mal im zweiten Code das image = nil und das Programm stützt gnadenlos ab, weil image auf einen Speicherbereich zeigt, der völlig andere Daten enthalten kann als erwartet.

Bei Deinem Bespiel leuchtet das nicht sofort ein warum Variante 1 genommen werden sollte, da die Variante 2 auch funktioniert weil vielleicht immer ein Bild angeben werden muss. Variable sollten immer geprüft werden, das kann ich als Programmierer nur empfehlen.

Was ich Dir noch empfehlen kann ist, schau Dir das mal an:



Viel besser kann man das nicht erklären!
 
Hi,

danke für die Info. Wie gesagt, das Prinzip der Optionals ist mir soweit klar. Mittlerweile ist es mir durch Lesen der Doku zur struct URL auch klar geworden. Da durch die Übergabe eines fehlerhaften String die Initialisierung fehlschlagen kann und dann ein nil zurückgeliefert wird ist eine Prüfung notwendig.
 
Zurück
Oben Unten