Schnell von Grund auf Eine Einführung in die Funktionen

Um alles in Swift erledigen zu können, müssen Sie die Besonderheiten von Funktionen kennenlernen. Die Funktionen sind in Swift außergewöhnlich leistungsstark und flexibel. Die Grundlagen sind einfach, insbesondere wenn Sie zuvor mit anderen Programmiersprachen gearbeitet haben. Aufgrund der flexiblen Syntax von Swift können Funktionen jedoch verwirrend sein, wenn Sie mit den Grundlagen nicht vertraut sind. 

In diesem Artikel konzentrieren wir uns zuerst auf die Grundlagen. Anschließend werden wir die komplexere Syntax und Anwendungsfälle im nächsten Artikel untersuchen. Es ist wichtig, dass Sie die Grundlagen nicht überfliegen, da sie wesentlich sind, um zu verstehen, woher die Leistung einer Funktion kommt. Beginnen wir damit, die Anatomie einer Funktion in Swift anhand eines Beispiels zu analysieren.

1. Lernen Sie durch Beispiel

Eine Funktion ist nichts anderes als ein Codeblock, der ausgeführt werden kann, wenn er benötigt wird. Schauen wir uns ein Beispiel für die grundlegende Anatomie einer Swift-Funktion an. Starten Sie Xcode und erstellen Sie einen neuen Spielplatz. Fügen Sie dem Spielplatz die folgende Funktionsdefinition hinzu.

func printHelloWorld () print ("Hallo Welt!")

Eine Funktion beginnt mit dem func Schlüsselwort und wird vom Namen der Funktion gefolgt, printHelloWorld in unserem Beispiel. Wie in vielen anderen Sprachen folgt auf den Namen der Funktion ein Paar Klammern, die die Parameter der Funktion enthalten - die Eingabe der Funktion.

Der Körper der Funktion ist in zwei geschweifte Klammern gehüllt. Das printHelloWorld () Funktion enthält eine einzelne Anweisung, die die Zeichenfolge druckt Hallo Welt! zur Standardausgabe. So sieht eine Basisfunktion in Swift aus. Die Syntax ist einfach, sauber und minimalistisch.

Sie können die Funktion aufrufen, indem Sie den Namen der Funktion gefolgt von einem Klammerpaar eingeben.

printHelloWorld ()

2. Parameter

Lassen Sie uns das obige Beispiel etwas komplexer gestalten, indem Sie Parameter zur Funktionsdefinition hinzufügen. Dies bedeutet einfach, dass wir die Funktion mit Eingabewerten versehen, die im Körper der Funktion verwendet werden können. Im folgenden Beispiel definieren wir die printMessage (Nachricht :) Funktion, die einen Parameter akzeptiert, Botschaft, vom Typ String.

func printMessage (Nachricht: Zeichenfolge) print (Nachricht)

Eine Funktion kann mehrere Parameter oder Eingabewerte akzeptieren. Die Parameter werden in Klammern eingeschlossen, die auf den Namen der Funktion folgen. Auf den Namen des Parameters folgt ein Doppelpunkt und der Typ des Parameters. Wie Sie sich erinnern, ist dies dem Deklarieren einer Variablen oder Konstante sehr ähnlich. Es sagt einfach, dass die Botschaft Parameter ist vom Typ String.

Anstatt einen hartcodierten String zu drucken, wie wir es in der printHelloWorld () Funktion drucken wir die Botschaft Parameterwert. Dies macht die Funktion flexibel und nützlicher.

Das Aufrufen der Funktion ist dem, was wir zuvor gesehen haben, sehr ähnlich. Der einzige Unterschied besteht darin, dass wir beim Aufrufen der Funktion ein Argument übergeben.

printMessage (Nachricht: "Hallo Welt!")

Beachten Sie, dass die Bedingungen Parameter und Argumente werden oft austauschbar verwendet, aber es gibt einen subtilen, semantischen Unterschied in Swift. In Swift sind Parameter die in der Funktionsdefinition angegebenen Werte, während Argumente die Werte sind, die an die Funktion übergeben werden, wenn sie aufgerufen wird.

Mehrere Parameter

Wie ich bereits erwähnt habe, ist die Syntax von Funktionen sehr flexibel und es sollte Sie nicht überraschen, dass es durchaus möglich ist, mehrere Argumente an eine Funktion zu übergeben. Im nächsten Beispiel erstellen wir eine Variante der printMessage (Nachricht: mal :) Funktion, mit der wir die Nachricht mehrmals drucken können.

func printMessage (message: String, times: Int) für i in 0… 

Der Name der Funktion ist jedoch identisch mit dem Namen des Originals printMessage (Nachricht :) Funktion ist der Typ der Funktion unterschiedlich. 

Es ist wichtig, dass Sie den vorherigen Satz verstehen. Lies es nochmals.

Jede Funktion hat einen Typ, der aus den Parametertypen und dem Rückgabetyp besteht. Wir werden die Rückgabe-Typen in Kürze untersuchen. Funktionen können denselben Namen haben, solange sich ihr Typ unterscheidet, wie in den beiden vorigen Funktionsdefinitionen dargestellt.

Der Typ der ersten Funktion ist (String) -> (), während der Typ der zweiten Funktion ist(String, Int) -> (). Der Name beider Funktionen ist derselbe. Mach dir keine Sorgen über die -> Symbol. Seine Bedeutung wird in wenigen Augenblicken klar, wenn wir Rückgabetypen diskutieren.

Der Zweite printMessage (Nachricht: mal :) Funktion definiert zwei Parameter, Botschaft vom Typ String und mal vom Typ Int. Diese Definition veranschaulicht eine der Funktionen, die Swift von Objective-C, lesbaren Funktions- und Methodennamen übernommen hat. Während der Name der Funktion lautet printMessage, Es ist leicht zu verstehen, was die Funktion tun soll, indem die Namen der Funktionsparameter gelesen werden.

In dieser Sekunde printMessage (Nachricht: mal :) Funktion erstellen wir eine zum-im Schleife zum Drucken der Botschaft Schnur mal mal. Wir verwenden den halboffenen Operator, … <, wie wir früher in dieser Serie gesehen haben.

Wenn wir anfangen zu tippen printMessage Auf dem Spielplatz zeigt Xcode beide Funktionen im Autovervollständigungsmenü an. Dank des Funktionstyps ist es einfach, die gewünschte Funktion auszuwählen. Aufrufen der zweiten printMessage (Nachricht: mal :) Funktion ist so einfach wie:

printMessage (Nachricht: "Hallo Welt", Zeiten: 3)

Standardwerte

Eine meiner Lieblingsfunktionen ist die Möglichkeit, Standardwerte für Parameter zu definieren. Das kann sich als dumm anhören, wenn Sie aus einer Sprache stammen, die diese Funktion seit Ewigkeiten hat. Dies ist jedoch sehr gut, wenn Sie seit vielen Jahren mit C und Objective-C arbeiten.

Kurz gesagt: Mit Swift können Entwickler Standardwerte für die Parameter einer Funktion definieren. Definieren Sie eine neue Funktion, die das aktuelle Datum in einem bestimmten Format druckt. Stellen Sie sicher, dass Sie die folgende Importanweisung oben auf Ihrem Spielplatz hinzufügen, um das UIKit-Framework zu importieren.

UIKit importieren

Lassen Sie uns zuerst das definieren printDate (Datum: Format :) Funktion ohne Verwendung von Standardwerten für einen der Parameter.

func printDate (Datum: Datum, Format: String) let dateFormatter = DateFormatter () dateFormatter.dateFormat = Formatdruck (dateFormatter.string (von: Datum))

Wenn Sie mit dem Foundation-Framework nicht vertraut sind und nicht wissen, was im Funktionskörper passiert, ist das in Ordnung. Der Schwerpunkt dieses Beispiels liegt nicht auf der Implementierung der Datumsformatierung. Im printDate (Datum: Format :), Wir verwenden den Wert von Format Parameter, um den Wert von zu formatieren Datum. Wenn wir keinen Wert für die Format Parameter gibt der Compiler einen Fehler aus.

Abhilfe können wir schaffen, indem Sie einen Standardwert für den zweiten Parameter der Funktion definieren, wie in der aktualisierten Funktionsdefinition unten gezeigt.

func printDate (Datum: Datum, Format: String = "JJ / MM / TT") let dateFormatter = DateFormatter () dateFormatter.dateFormat = Formatdruck (dateFormatter.string (von: Datum))

Das Definieren eines Standardwerts ist so einfach wie das Festlegen eines Werts in der Liste der Parameter in der Funktionsdefinition. Das Ergebnis ist, dass sich der Compiler nicht mehr beschwert und der Fehler verschwindet.

printDate (Datum: Datum ())

Obwohl wir einen Standardwert für die angegeben haben Format Parameter können wir immer noch einen Wert übergeben, wenn wir wollen.

printDate (Datum: Datum (), Format: "TT / MM / JJ")

Beachten Sie, dass Apple Positionierungsparameter mit einem Standardwert am Ende der Parameterliste empfiehlt. Dies ist sicherlich eine gute Idee und wird in den meisten anderen Programmiersprachen verwendet, die optionale Parameter unterstützen.

3. Rückgabetyp

Die Funktionen, die wir bisher gesehen haben, geben uns nichts zurück, wenn wir sie aufrufen. Lass uns das machen printDate (Datum: Format :) Funktion nützlicher, indem das formatierte Datum als Zeichenfolge zurückgegeben wird, anstatt das formatierte Datum im Hauptteil der Funktion zu drucken. Dies erfordert zwei Änderungen, wie Sie unten sehen können.

func printDate (Datum: Datum, Format: String = "JJ / MM / TT") -> String let dateFormatter = DateFormatter () dateFormatter.dateFormat = Format Rückgabe dateFormatter.string (von: Datum)

Als erstes ändern wir die Definition der Funktion. Nach der Liste der Parameter geben wir den Rückgabetyp an, String. Dem Rückgabetyp wird das vorangestellt -> Symbol. Wenn Sie mit CoffeeScript gearbeitet haben, wird Ihnen das bekannt vorkommen.

Anstelle des formatierten Datums mit der print (_: Trennzeichen: Terminator :) Funktion verwenden wir die Rückkehr Schlüsselwort, um den Wert aus der Funktion zurückzugeben. Das ist alles was wir tun müssen. Lass es uns ausprobieren.

let formatattedDate = printDate (Datum: Datum (), Format: "TT / MM / JJ") Druck (Formatiertes Datum)

Wir rufen das an printDate (Datum: Format :) Funktion, speichern Sie den zurückgegebenen Wert in der Konstante formatiertes Datum, und drucken Sie den Wert von formatiertes Datum in der Standardausgabe. Beachten Sie, dass der Name der printDate (Datum: Format :) Diese Funktion spiegelt nicht mehr ihre Funktion wider, daher möchten Sie sie möglicherweise ändern formatDate stattdessen.

Kein Rückgabetyp

Die anderen Funktionen, die wir in diesem Lernprogramm definiert haben, hatten keinen Rückgabetyp. Wenn für eine Funktion kein Rückgabetyp vorhanden ist, ist es nicht erforderlich, den Wert einzufügen -> Symbol in der Funktionsdefinition.

Ein paar Absätze zuvor habe ich Ihnen gesagt, dass keine der von uns definierten Funktionen einen Wert für uns erbracht hat. Das stimmt eigentlich nicht ganz. Lassen Sie mich die wichtigsten Details mit einem Experiment erklären. Fügen Sie Ihrem Spielplatz die folgende Zeile hinzu und sehen Sie, was passiert.

Das ist interessant. Swift hat kein Problem, dass wir den Rückgabewert von speichern printHelloWorld () Funktion in einer Konstante, aber es warnt uns, dass der Typ des zurückgegebenen Werts nicht der ist, von dem wir glauben, dass er es ist.

Was passiert hier? Jede Funktion in Swift gibt einen Wert zurück, auch wenn in der Funktionsdefinition kein Rückgabetyp definiert wird. Wenn eine Funktion einen Rückgabetyp nicht explizit angibt, wird die Funktion implizit zurückgegeben Leere, was einem leeren Tupel entspricht, oder () kurz. Sie sehen dies im Ausgabebereich des Spielplatzes und wird auch in der Warnung der Compiler-Ausgaben erwähnt.

Wir können die obige Warnung loswerden, indem wir den Typ von explizit angeben Wert, ein leeres Tupel. Ich stimme zu, dass es nicht sehr nützlich ist, ein leeres Tupel in einer Konstante zu speichern, aber es zeigt Ihnen, dass jede Funktion einen Rückgabewert hat.

Wert setzen: () = printHelloWorld ()

Tuples

Eine weitere großartige Funktion von Swift ist die Möglichkeit, mehrere Werte von einer Funktion durch Rückgabe eines Tupels zurückzugeben. Das folgende Beispiel zeigt, wie das funktioniert. Lassen Sie mich wiederholen, dass es nicht wichtig ist, dass Sie verstehen, wie die timeComponentsForDate (Datum :) Funktion macht ihren Job. Der Fokus ist der Rückgabewert der Funktion, ein Tupel mit drei Elementen.

func timeComponentsForDate (_ date: Date) -> (Stunde: Int, Minute: Int, Sekunde: Int) let dateComponents = Calendar.current.dateComponents ([. Stunde,. Minute,. Sekunde], vom: Datum) Let Stunde = dateComponents.hour let minute = dateComponents.minute let Sekunde = dateComponents.second zurück (Stunde ?? 0, Minute ?? 0, Sekunde ?? 0)

Die Funktion akzeptiert ein Argument, a Datum Instanz und gibt ein Tupel mit drei gekennzeichneten Werten zurück. Das Kennzeichnen der Werte des Tupels dient nur der Bequemlichkeit. Die Etiketten können weggelassen werden.

func timeComponentsForDate (_ date: Date) -> (Int, Int, Int) let dateComponents = Calendar.current.dateComponents ([. Stunde, Minute,. Sekunde], von: Datum) let Stunde = DatumComponents.Stunde Minute = dateComponents.minute let second = dateComponents.second Rückkehr (Stunde ?? 0, Minute ?? 0, Sekunde ?? 0)

Wie das folgende Beispiel zeigt, ist das Beschriften der Werte des von der Funktion zurückgegebenen Tupels sehr bequem und macht den Code leichter verständlich.

let timeComponents = timeComponentsForDate (Date ()) print (timeComponents.hour) print (timeComponents.minute) print (timeComponents.second)

Es ist auch möglich, einen optionalen Wert von einer Funktion zurückzugeben, wenn Szenarien vorliegen, in denen die Funktion keinen Wert hat, der zurückgegeben werden soll. Dies ist so einfach wie das Festlegen des Rückgabetyps der Funktion als optional, wie unten gezeigt.

func timeComponentsForDate (_ date: Date) -> (Stunde: Int, Minute: Int, Sekunde: Int)? let dateComponents = Calendar.current.dateComponents ([. Stunde,. Minute,. zweite], von: Datum) guard let Stunde = dateComponents.hour else return nil guard let Minute = dateComponents.minute else return nil guard let second = dateComponents.second else return nil return (Stunde, Minute, Sekunde)

Fazit

In diesem Tutorial haben wir die Grundlagen der Funktionen in Swift untersucht. Es ist wichtig, dass Sie die Syntax von Funktionen verstehen, denn im nächsten Artikel werden wir erweiterte Funktionen untersuchen, die auf den in diesem Tutorial behandelten Funktionen aufbauen.

Ich ermutige Sie, den Artikel gegebenenfalls noch einmal zu lesen und vor allem einige Funktionen auf einem Spielplatz zu schreiben, um sich mit der Syntax vertraut zu machen. Die Grundlagen sind einfach zu verstehen, aber Sie werden nur durch das Üben beherrscht.

Wenn Sie wissen möchten, wie Sie mit Swift 3 echte Apps programmieren können, lesen Sie unseren Kurs Erstellen von iOS-Apps mit Swift 3. Ob Sie nun mit der iOS-App vertraut sind oder ob Sie von Objective-C auf den Wechsel wechseln möchten Natürlich erhalten Sie mit Swift einen Einstieg in die App-Entwicklung.