Verständnisfrage zu Optionals in Swift

Diskutiere das Thema Verständnisfrage zu Optionals in Swift im Forum App Entwickler für iOS. Hallo, ich arbeite mich derzeit in Swift ein und mir ist soweit das Prinzip der Optionals...

  1. Klaber

    Klaber Thread Starter Mitglied

    Beiträge:
    30
    Zustimmungen:
    11
    Mitglied seit:
    14.09.2016
    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
     
  2. MchaelKn

    MchaelKn Mitglied

    Beiträge:
    497
    Medien:
    1
    Zustimmungen:
    73
    Mitglied seit:
    25.06.2008
    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!
     
  3. Klaber

    Klaber Thread Starter Mitglied

    Beiträge:
    30
    Zustimmungen:
    11
    Mitglied seit:
    14.09.2016
    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.
     
Die Seite wird geladen...
  1. Diese Seite verwendet Cookies. Wenn du dich weiterhin auf dieser Seite weitersurfst, akzeptierst du unseren Einsatz von Cookies. Akzeptieren Weitere Informationen...