Programmieren mit Swift - Für macOS und iOS
Programmieren mit Swift - Für macOS und iOS
Das Programm

Um diese Anwendung zu erstellen, erzeugen Sie ein neues Xcode Projekt vom Typ Cocoa Application. Es soll den Namen GeoConverter tragen.
stacks_image_293A2B89-A0EB-4C04-B56B-A3D0B61ACB7F
Wie auch in der letzten Lektion benötigen Sie eine neue Objective-C Klasse, die Sie MyController nennen.
stacks_image_DAF1A539-049A-4734-A5CD-9C73DCE554CB
Öffnen Sie anschliessend die MyController.h-Datei, falls sich diese nicht selbstständig geöffnet hat. In diesem Controller benötigen Sie zwei Action. Eine Action, um die Berechnung auszuführen, und eine weitere Action, um die Eingabefelder wieder zu leeren und sie somit für weitere Eingaben vorzubereiten. Nennen Sie diese Action deshalb calculate und clearFields.

Obwohl der Name etwas verwirrend sein mag, kann man mit einem Outlet mehr tun als nur Text ausgeben. Genauso gut können mit einem Outlet, zum Beispiel einem NSTextField, Eingaben in das Programm eingelesen werden. Die Verbindung eines Outlet funktioniert also in beide Richtungen.

Für die Umrechnung von Koordinaten in Längen- oder Breitengraden brauchen Sie drei Eingabefelder. Ein Feld für Grad, ein Feld für Minuten und ein weiteres für Sekunden. Dementsprechend sollten Sie dieses Outlet auch benennen. Natürlich wäre das ganze Programm nutzlos, würden die umgerechneten Werte nicht auch auf irgendeine Art angezeigt. Dafür benötigen Sie zwei weitere Outlet. Ein Outlet für die Umrechnung in RAD und ein Outlet für den dezimalen Wert Grad. Verwenden Sie als Outlet Type NSTextField und schreiben Sie einen Stern direkt vor den Name des Outlet. Der Stern bestimmt, dass dieses Outlet ein Zeiger ist. Zeiger sind eine besondere Art von Datentypen, die keine Werte beinhalten, sondern auf bestimmte Positionen im Arbeitsspeicher zeigen. Mehr dazu in späteren Lektionen.
#import <Cocoa/Cocoa.h>

@interface MyController : NSObject {

    IBOutlet NSTextField *inputGrad;
    IBOutlet NSTextField *inputMinuten;
    IBOutlet NSTextField *inputSekunden;
    IBOutlet NSTextField *outputGrad;
    IBOutlet NSTextField *outputRAD;
}

- (
IBAction)calculate:(id)sender;
- (
IBAction)clearFields:(id)sender;

@end
Auch die Umsetzung der Programmierung, die in der MyController.m stattfindet, ist nicht sonderlich schwierig. Die einfachere der beiden Aufgaben ist es sicherlich, die Textfelder wieder zu leeren. Dafür müssen Sie nur einen Leertext in die Felder schreiben. Im Programmcode sieht die Methode dafür so aus:
- (IBAction)clearFields:(id)sender
{
    [outputGrad setStringValue:
@""];
    [outputRAD setStringValue:
@""];
    [inputGrad setStringValue:
@""];
    [inputMinuten setStringValue:
@""];
    [inputSekunden setStringValue:
@""];
}
Das war sicherlich nicht schwer, aber jetzt ist der Zeitpunkt, wo Sie wirklich rechnen müssen. Der ganze Vorgang besteht aus mehreren Schritten. Erzeugen Sie am besten zuerst eine komplett leere Methode für die calcualte-Action.
- (IBAction)calculate:(id)sender
{
}
Nun werden wir die Methode langsam mit Inhalt füllen. Zuerst benötigen Sie zwei Variablen, welche die Rechenergebnisse aufnehmen können.
double outGrad = 0;
double outRAD = 0;
Anschließend definieren Sie Variablen, welche die Werte aus den NSTextfield speichern können, also die Eingaben.
double inGrad = [inputGrad doubleValue];
double inMinuten = [inputMinuten doubleValue];
double inSekunden = [inputSekunden doubleValue];
Um die Eingabe eines Textfeldes als Zahl in den Programmcode zu bekommen, ist es ausreichend die Nachricht doubleValue an das Steuerelement zu senden. Die Konvertierung geschieht dabei automatisch. Lässt sich die Eingabe nicht in den Typ double umwandeln, weil es vielleicht Buchstaben sind, erhält man eine 0 als Wert.

Hat man alle Eingaben eingelesen, kann gerechnet werden.
outGrad = inGrad + (inMinuten / 60) + (inSekunden / 3600);
outRAD = outGrad /
180 * M_PI;
Der Bezeichner M_PI ist nur ein Platzhalter für eine Zahl, die von Apple als 3.14159265358979323846264338327950288 hinterlegt wurde.

Zum Schluss müssen noch die Rechenergebnisse in die NSTextfield für die Ausgabe eingetragen werden. Auch dafür gibt es passende Nachrichten.
[outputGrad setFloatValue:outGrad];
[outputRAD setFloatValue:outRAD];
Und jetzt noch einmal die ganze Methode im Zusammenhang.
- (IBAction)calculate:(id)sender
{
    double outGrad = 0;
    double outRAD = 0;

    double inGrad = [inputGrad doubleValue];
    double inMinuten = [inputMinuten doubleValue];
    double inSekunden = [inputSekunden doubleValue];

    outGrad = inGrad + (inMinuten /
60) + (inSekunden / 3600);
    outRAD = outGrad /
180 * M_PI;

    [outputGrad setFloatValue:outGrad];
    [outputRAD setFloatValue:outRAD];
}
Damit ist die Programmierarbeit getan. Der Rest der Anwendung muss im Interface Builder erstellt werden.

nächste Seite