Programmieren mit Swift - Für macOS und iOS
Programmieren mit Swift - Für macOS und iOS
Projekt und Controller

Um die Anwendung zu erstellen, erzeugen Sie ein Xcode Projekt vom Typ Cocoa Application und bestätigen Sie die Auswahl mit der Schaltfläche Next.
stacks_image_3CF0426C-C5E4-4834-8790-3FD664563EAE
Der Projektname soll GeoConverter sein, denn er beschreibt die Aufgabe der Anwendung gut. Die Programmiersprache unserer Wahl ist Swift. Ein Storyboard sowie Core Data werden nicht benötigt.
stacks_image_8029BBEE-7119-4A66-B9D0-8DD76DB40C4A
Nachdem die Entwicklungsumgebung das Projekt angelegt hat, können wir mit der Arbeit am Controller der Anwendung, der Klasse AppDelegate, beginnen und unsere erste Aufgabe soll es sein, die Anschlüsse für die grafische Oberfläche im Programmcode bereitzustellen. Wie Sie auf der Abbildung in der Einleitung gesehen haben, verfügt das Programm über zwei Schaltflächen auf dem View, was in den meisten Fällen eine identische Anzahl von IBAction im Controller zur Folge hat. So ist es auch in unserem Projekt. Der ersten Action kommt die Aufgabe zu Teil, die Umrechnung zu initiieren. Die zweite Action wird benötigt, um die Eingabefelder zu leeren und sie für neue Eingaben vorzubereiten. Das schafft für den Anwender ein wenig Komfort. Nennen Sie die IBAction calculateButtonClicked und clearButtonClick und implementieren Sie beide in der Datei AppDelegate.swift wie im folgenden Listing zu sehen. Die von Xcode vorbereiteten Methoden applicationDidFinishLaunching und applicationWillTerminate können Sie für den Augenblick ignorieren.
import Cocoa

@NSApplicationMain
class AppDelegate: NSObject, NSApplicationDelegate {

    @IBOutlet weak var window: NSWindow!

     @IBAction func calculateButtonClicked(sender:AnyObject)
     {

     }

     @IBAction func deleteButtonClicked(sender:AnyObject)
     {

     }

     func applicationDidFinishLaunching(aNotification: NSNotification) {
     }

     func applicationWillTerminate(aNotification: NSNotification) {
     }
}
Zur Ausgabe der Ergebnisse auf der grafische Oberfläche müssen im Controller ebenfalls Anschlüsse bereit gestellt werden und diese Aufgabe übernehmen in Swift-Projekten die IBOutlet. Die Bezeichnung Outlet kann für Einsteiger verwirrend sein, denn ein Outlet ist nicht nur eine Verbindung vom Controller zum View, sie funktioniert auch in die andere Richtung. Eine IBOutlet kann verwendet werden, um einen Wert vom View in den Controller einzulesen. In unserem Projekt sind das die Werte aus den Eingabefeldern für Grad, Minuten und Sekunden. Insgesamt brauchen wir im Controller fünf IBOutlet, die mit Steuerelementen vom Typ NSTextField verbunden werden können. Eine Verbindung zum Fenster (window) hat Xcode schon vorbereitet, obwohl wir sie im aktuellen Projekt nicht benötigen.
import Cocoa

@NSApplicationMain
class AppDelegate: NSObject, NSApplicationDelegate {

    @IBOutlet weak var window: NSWindow!
    @IBOutlet weak var inputDegree:NSTextField!
    @IBOutlet weak var inputMinutes:NSTextField!
    @IBOutlet weak var inputSeconds:NSTextField!
    @IBOutlet weak var outputDegree:NSTextField!
    @IBOutlet weak var outputRadiants:NSTextField!
...
Durch Anweisungen Innerhalb der deleteButtonClicked-Methode sollen sämtliche Eingabefelder auf der grafische Oberfläche geleert werden und das funktioniert am besten, indem man die Eigenschaft stringValue der Steuerelemente auf eine leere Zeichenkette setzt. Im Programmcode sähe die Methode so aus:
@IBAction func deleteButtonClicked(sender:AnyObject)
{
    self.inputDegree.stringValue = ""
    self.inputMinutes.stringValue = ""
    self.inputSeconds.stringValue = ""
    self.outputDegree.stringValue = ""
    self.outputRadiants.stringValue = ""
}
Aufwändiger ist die Methode calculateButtonClicked. Dort benötigen wir zwei Variablen, um die Ergebnisse aufzunehmen, die nach Abschluss der Berechnungen an die Steuerelemente übergeben werden.
@IBAction func calculateButtonClicked(sender:AnyObject)
{
    var resultDegrees:Double
    var resultRadiants:Double
}
Als nächstes müssen die Eingaben des Anwenders in die Methode geholt werden und über die Eigenschaft doubleValue können wir die Werte von einem NSTextField sofort als Double-Typen bekommen. Weil sich die Werte innerhalb der Methode nicht ändern werden, sollten wir sie in Konstanten ablegen. Lässt sich eine Eingabe nicht in Double umwandeln, vielleicht weil es sich um Buchstaben handelt, erhält man von doubleValue den Wert 0.
...
let inDegrees = self.inputDegree.doubleValue
let inMinutes = self.inputMinutes.doubleValue
let inSeconds = self.inputSeconds.doubleValue
...
Nachdem in der Methode alle Werte zur Verfügung stehen kann gerechnet werden:
...
resultDegrees = inDegrees + (inMinutes / 60.0) + (inSeconds / 3600.0)
resultRadiants = resultDegrees / 180.0 * M_PI
...
Nach getaner Arbeit müssen die Ergebnisse an Felder für die Ausgabe übergeben werden. Das funktioniert, indem der Eigenschaft doubleValue ein Wert zugewiesen wird. Die grafische Oberfläche aktualisiert dann automatisch. Der im Code verwendete Bezeichner M_PI ist ein Platzhalter für eine Zahl, die von Apple als 3.14159265358979323846264338327950288 hinterlegt wurde.
...
self.outputDegree.doubleValue = resultDegrees
self.outputRadiants.doubleValue = resultRadiants
...
Hier noch einmal die ganze Methode im Zusammenhang:
@IBAction func calculateButtonClicked(sender:AnyObject)
{
    var resultDegrees:Double
    var resultRadiants:Double

    let inDegrees = self.inputDegree.doubleValue
    let inMinutes = self.inputMinutes.doubleValue
    let inSeconds = self.inputSeconds.doubleValue

    resultDegrees = inDegrees + (inMinutes / 60.0) + (inSeconds / 3600.0)
    resultRadiants = resultDegrees / 180.0 * M_PI

    self.outputDegree.doubleValue = resultDegrees
    self.outputRadiants.doubleValue = resultRadiants
}
Damit ist die Programmierarbeit getan. Die verbleibenden Arbeiten müssen im Interface Builder ausgeführt werden.

nächste Seite