Logische Operatoren

Willkommen in dieser Lektion über logische Operatoren aus unserer Reihe “Swift lernen”.

In dieser Lektion behandeln wir das Thema logische Operatoren mit Hilfe derer wir Vergleiche verknüpfen können. Dies ist sehr hilfreich um z.B. mehrere Zustände miteinander zu verbinden und zu vergleichen. Logische Operatoren liefern immer einen Wahrheitswert zurück, daher sind diese nur für Kontrollstrukturen geeignet.

Für diesen Teil gibt es auch ein Video Tutorial hier auf YouTube.

 

Was sind logische Operatoren?

Logische Operatoren ermöglichen es uns Ergebnisse bei Vergleichen logisch miteinander  zu verbinden. Je nachdem welcher logische Operator benutzt wird kann bei dem Vergleich ein Wahrheitswert true oder false heraus kommen. Die Verknüpfung wird mit zwei Operanden benutzt, die jeweils wieder links und rechts vom logischen Operator stehen.

Die bekanntesten logischen Operatoren sind die “und”- und “oder”-Verknüpfung, dargestellt in Swift durch den “&&”-Operator und dem “||”-Operator. Um das | Zeichen (auch genannt Pipe) auf dem Mac zu schreiben, müssen Sie die Tastenkombination “alt+7” drücken.

In Swift gibt es genau 3 logische Operatoren. Den logischen “und”-, “oder “– und “not”-Operator.

 


 Und-Verknüpfung

Bei der “&&”-Verknüpfung wird jeweils der Wahrheitswert links und rechts verbunden. Anhand der Tabelle können wir entnehmen was das Ergebnis ist wenn ich die linke und die rechte Seite logisch verknüpfe. Das Ergebnis kann dann in einer Kontrollstruktur eingesetzt werden um den Programmablauf zu steuern.

Und Verknüpfungstabelle
Und Verknüpfungstabelle

 

Wenn wir uns das ganze anhand von Programmcode ansehen, werden wir feststellen das eine If-Kontrollstruktur nur dann erfolgreich in den “true” Teil springt, wenn A und B “true” sind. Sollte eine oder beide Seiten der Verknüpfung “false” sein, ist die Verknüpfung auch “false”.

Beide Seiten sind “true”. Der Programmcode im “true”-Teil der Kontrollstruktur wird also ausgeführt.

Anders sieht es aus wenn eine Bedingung “false” ist. Dann ist der Vergleich bei der “Und”-Verknüpfung “false”.

Dieses Beispiel ist ebenfalls “false” da bereits eine Seite mit “false” ausreicht damit eine “Und”-Verknüpfung unwahr ist.

Selbstverständlich benutzt man den “&&”-Operator um reale Werte zu Vergleichen. Zur Veranschaulichung benutzen wir aber bewusst “true” und “false” damit man sieht, dass der Wahrheitswert eines Vergleiches verknüpft wird. Ein reales Szenario könnte wie folgt aussehen.

Wir überprüfen ein eingegebenes Passwort. Der Benutzer tippt die Werte “geheim” in das Passwort- und dessen Wiederholungsfeld ein. In unserer Kontrollstruktur prüfen wir nun ob das Passwort “geheim” entspricht UND (&&) ob die Passwortwiederholung ebenfalls “geheim” ist. Links und rechts wird also zuerst der Vergleich auf die Werte gemacht und danach die Wahrheitswerte derer verglichen.

Da beide Vergleiche “true” sind ist auch unsere logische Verknüpfung “true”. “true” und “true” ergibt mit dem “&&”-Vergleich laut Tabelle “true”. Es wird der “true”-Teil der If-Kontrollstruktur ausgeführt.

Eine Verknüpfung mehrere logische Operatoren sehen wir am Ende der Lektion.

 

Oder-Verknüpfung

Bei der “||”-Verknüpfung wird im Gegensatz zu der “&&”-Verknüpfung nur erwartet das eine der beiden Seiten wahr ist. Sollten aber beide Werte unwahr sein ist auch das Ergebnis der Oder-Verknüpfung unwahr.

swift_oder_verknüpfung
Oder-Verknüpfungstabelle

 

Für uns lässt sich daher folgendes für die Oder-Verknüpfung ableiten.
“true” oder “true” sind wahr.

Da eine der beiden Seiten “true” ist wird auch das Ergebnis der Verknüpfung“true”

Sollten beide Seiten unwahr sein, ist auch das Ergebnis der Bedingung unwahr.

Wenn wir jetzt das ganze wieder mit einem realen Szenario darstellen wird es dem ein oder anderen hilfreicher erscheinen als einfach nur die Bool Werte zu verknüpfen. Wir haben einen Passwort-Check. Zusätzlich kann man aber auch in das System, wenn man den Benutzernamen “Super-User” hat. In diesem Vergleich sind sogar beide Werte “true”. Eine der beiden Seiten hätte aber für Oder-Verknüpfung ausgereicht.

 

Not-Verknüpfung

Als letzte Verknüpfung gibt es unter Swift noch die “!”-Verknüpfung. Die “Not”-Verknüpfung ist ebenfalls symbolisiert durch das Ausrufezeichen “!” und wir haben Ihn sogar bereits mehrfach verwendet, jedoch nicht als logische Verknüpfung.

Werfen wir einen Blick auf die folgende Tabelle. Wir negieren jeweils den Wert A. Der Wert der dabei raus kommt kann von unserer Kontrollstruktur überprüft werden.

swift_not_verknüpfung
Not-Verknüpfung

 

 

 

 

Sollte der Wert wahr sein, wird dieser umgedreht und ergibt laut Not-Tabelle “false”.

Im Falle das er nicht wahr ist wird er umgekehrt und ergibt “true”.

 

Wie schon bei unseren oberen Beispielen refelktiert dies keinen echten Code. In dem folgenden Codeschnippsel sehen wir aber einen sehr nützlichen Einsatz. Wir möchten Bool Werte nicht immer prüfen mit if a == true  oder if a != true . Bei Bool Werten können wir direkt den Variablennamen eintragen ohne den “==”-Operator nutzen zu müssen. Die Kontrollstruktur erwartet im Grunde ja nur einen Bool-Wert.

Wenn es uns zum Beispiel nur interessiert ob etwas nicht “true” ist, können wir den Wert der Variable einfachen “notten” (Umgangssprachlich für “den Wert umkehren” bei Entwicklern in Deutschland) . Interessiert es uns z.B. ob ein Benutzer keine Administrationsrechte hat prüfen wir einfach sein Recht “istAdmin” und drehen den Wert um. Da der Benutzer in unserem Beispiel keine Rechte hat wird aus “false” -> “true” und die Bedingung ist wahr.

Diese Kurzschreibweise werden wir später sehr häufig nutzen da sie nicht nur genauso Eindeutig ist wie der Vergleich mit dem “==”-Operator, sondern auch kompakter und wesentlich gängiger in der Softwareentwicklung.

Verknüpfungen verknüpfen

Natürlich fragt sich der ein oder andere: “Kann ich jetzt auch mehrere dieser verschiedenen Verknüpfungen verknüpfen…???”

Ja das geht!

Und gleich vorweg! Ihr könnt die vergleiche Gruppieren und verschachteln. Wenn ihr dies tut müsst ihr diese aber auch Klammern. Schauen wir uns dazu einige Beispiele an.

In diesem Beispiel haben wir vier Bool Werte. Die ersten zwei bestimmen ob jemand Administrator ist und ggf. der Super Admin, die anderen beiden Bool Werte ob der Benutzer überhaupt ein Benutzer ist und ob dieser Aktiviert ist. In unserem ersten Vergleich prüfen wir ob der Benutzer aktiviert ist. Dies trifft zu und der Vergleich ist wahr.

Wir deaktivieren den Benutzer indem wir seinen Statuswert auf “false” setzen. Anschließend prüfen wir zur Sicherheit ob es ein Benutzer ist der nicht aktiviert ist. Wir drehen den Wahrheitswert von “istAktiviert” um und bekommen für diesen Vergleich jetzt “true”. Da wir bei der “&&”-Verknüpfung jetzt “true” und “true” haben ist der Vergleich wahr.

Vielleicht sollte unser System aber so klug sein und einen Oberadministrator nicht ausschließen. Wir ergänzen also den Vergleich mit Klammern für unsere erste Bedingung und bilden daraus eine eigene Logikgruppe. Wir schreiben dann den “||”-Operator mit dem wir überprüfen ob der Benutzer ein Oberadministrator ist.

Sollte jetzt der linke Vergleich fehlschlagen und der Benutzer ist aber ein Oberadministrator, dann ist laut der “Oder”-Tabelle der Vergleich wahr und der if-Teil für “true” wird ausgeführt.

Natürlich kann man diese Verknüpfungen endlos aneinander hängen. Achten Sie aber bitte darauf das es leserlich bleibt. Man kann sehr schnell durcheinander kommen wenn viele Klammern und Gruppierungen verwendet.

Wir überprüfen ob der Anwender ein Benutzer, ein Administrator und ein Oberadministrator ist. Sollte alles zutreffen gehen wir davon aus das er der Beste ist.

In dem letzten Beispiel kehren wir den OberAdmin Status um. Wir sind an dieser Stelle tippfaul und nehmen den aktuellen Wert von “istOberAdmin” und drehen diesen mit dem “!”-Operator um. Den umgekehrten Wert weisen wir mit dem “=”-Operator der Variable istOberAdmin wieder zu.

Der Benutzer ist jetzt nicht mehr aktiviert und auch kein Oberadministrator mehr. Er ist also leider nicht mehr der Beste.

 

Zusammenfassung

Mit logischen Operatoren haben wir eines der mächtigsten Werkzeuge und wohl eine der am häufigsten eingesetzten Methode um Vergleiche logisch zu verknüpfen. Der Programmfluss ist mit Kontrollstrukturen immer wieder zu überprüfen und ständig müssen wir Entscheidungen treffen. Mit den neuen Operatoren können wir aber deutlich kompakter und auch “logischer” den Programmcode gestalten und optimieren.

Wir werden in der Zukunft mehr als genug von ihnen Gebrauch machen und Sie werden erstaunt sein wie viel Arbeit uns das ganze bei Fallunterscheidungen abnehmen kann.

In unserer nächsten Lektion beschäftigen wir uns mit Datentypen. Wir werden die für uns momentan wichtigsten Unterschiede und mit einigen Beispielen auch die Limitierungen kennenlernen.

Wir wünschen euch weiterhin viel Spaß beim lernen! Feedback und Anregungen sind jederzeit ausdrücklich erwünscht.

Previous post

Swift lernen: Operatoren

Next post

Swift lernen: Datentypen

The Author

Stefan Mayer-Popp

Stefan Mayer-Popp

Stefan Mayer-Popp ist leidenschaftlicher Softwareentwickler, Fachbuchautor, Trainer und Berater aus dem Münchner Umland. Als passionierter IT- und Apple-Profi hat Mayer-Popp unzählige IT-Projekte in verschiedensten Branchen erfolgreich umsetzen und unterstützen können. Neben seiner Tätigkeit als Teamleiter bei CHECK24 teilt Mayer-Popp seine Erfahrungen auf IT-Veranstaltungen und propagiert Swift aktiv auf verschiedenen Meetups.

3 Comments

  1. learnToSwift
    1. Juli 2014 at 15:26 — Antworten

    Hallo Zusammen,

    vielen Dank für eure super Tutorials.

    Ich versuche gerade ganz simple einfach zwei integer in eine zu vergleichen aber ich erhalte immer Fehlermeldungen und hab echt keine Ahnung was falsch ist.

    var foo: Integer = 1
    var bar: Integer = 2

    if foo == bar {
    // print ist egual
    } else {
    // print sind nicht gleich
    }

    Als Fehlermeldung erscheint immer: Could not find overload for “==” ….

    Könnt ihr mir sagen wie ich in Swift sauber zwei Integer auf Gleichheit prüfen kann?

    • 1. Juli 2014 at 16:23 — Antworten

      Hallo Evil-Fene,

      das liegt daran das der Datentyp Integer nicht Equatable ist. Der Richtige Datentyp ist einfach Int. Das ist ein wenig verwirrend am Anfang, aber man gewöhnt sich daran.

      Vielen Dank,
      – Stefan

      • learnToSwift
        1. Juli 2014 at 16:28

        Ahh verstehe. 🙂

        Super vielen Dank für die schnelle Antwort. Jetzt funktioniert es auch.

Leave a reply

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.