Swift Schnelleinstieg

Mit Swift ist den Entwicklern bei Apple, meiner Meinung nach, ein großer Wurf gelungen. Auf der WWDC14 im Juni 2014 vorgestellt sind wir aktuell bei Version 3.0. Da Objective-C schon über 30 Jahre alt ist hält es nicht mehr ganz mit modernen Programmierkonzepten mit. Swift ist kurz und klar gefasst und reagiert besser auf Fehler. Swift ist für die Arbeit mit Cocoa und Cocoa Touch entwickelt worden und kann mit Objective-C gemeinsam genutzt werden. Für alle die sich einfach nur mal in der iOS Entwicklung versuchen möchten gibt es seit Xcode 7 eine tolle Neuerung. Du kannst ohne teuren Developer Account deine App auf dein Gerät laden und testen.
Variablen & Konstanten
var bikes = 4 // die Variable Bikes repräsentiert die Anzahl der Fahrräder eines Spielers bikes = 1 // die Variable ändert sich auf 1, da die Freundin des Spielers mehr Platz im Keller benötigt
Der Compiler weiß in diesem Fall implizit, dass es sich um eine Ganzzahl vom Typ Int handelt. Man kann den Datentyp Int aber auch explizit angeben:
var bikes: Int = 3
In Spielen oder anderen Anwendungen gibt es meist auch Daten die sich während der Laufzeit nicht ändern.
let gravity = -9.8 // Wert für die Gravitation im Physikalischen Raum let winMessage: String = „You Win! // explizite Deklaration der Gewinnnachricht
Tip - Konstanten
Man wird auch immer höflichst von Xcode darauf hingewiesen besser Konstanten zu verwenden wenn sich der Inhalt nach der Initialisierung nicht geändert hat.
Hinweis
Datentypen
Übersicht
Int: Integers – ganze Zahlen von -2.147.483.648 bis +2.147.483.647
Float: Fließkommazahlen („.“) mit 6 Stellen und 32 Bit
Double: Fließkommazahlen („.“) mit 15 Stellen und 64 Bit
String: Sammlung von Zeichen (Zahlen, Buchstaben & Symbole/Emojis)
Bool: Wahrheitswert (true oder false)
Strings
var playerName: String = "Moritz"
Zwei oder mehrer Zeichenketten werden mit dem „+“ Operator verbunden:
var teamName = playerName + " Leonhard"
Um bestehende Zeichenketten mit Rückgabewerten von Funktionen oder anderen Datentypen zu kombinieren gibt es in Swift den Prozess der String Interpolation:
var playerAge: Int = 12 var gameMessage: String = "The Player \(playerName) is \(playerAge) years old."
String - Characters
NS-Datentypen
Arrays, Matrizen & Dictionaries
Arrays
Ein Array ist eine geordnete Liste mit einem Startindex von 0 bis zur Anzahl der Elemente in einem Array -1. Hier ein Beispiels für ein Array aus Strings:
let bikeNames : [String] = ["Stumpjumper Evo", "Santa Cruz Nomad", "Yeti SB6"]
Hinweis - Arrays
Matrix / 2D Arrays
Matrizen eignen sich neben der Berechnung von linearen Aufgaben vor allem für die Entwicklung von Tile-Based oder Iso Games. Die Anordnung der Kacheln kann in 2 Dimensionalen Arrays in Reihen und Spalten ausgedrückt werden.
var gameBoard = [[1,2,3,4], [5,6,7,8], [9,10,11,12]]
Erstellen von leeren 2d Arrays:
var isoBoard : [[Int]] = [] // a blank 2d array var theSameIsoBoaard = Array<Array<Int>>() // same array
Dictionaries
Eine besser lesbare Alternative zu Arrays bildet das Dictionary. key : value Paare bilden die Grundlage für die Erstellung. Ein Dictionary speichert ebenfalls nur Werte des selben Typs die im Gegensatz zu Arrays nicht sortiert sind. Zusätzlich zum Wert eines Elements wird ein „Key“ gespeichert über den auf den Wert zugegriffen werden kann. In anderen Programmiersprachen werden sie auch assoziative Arrays genannt.
var gameMessages: [String : String] = ["win" : "you win!", "lost" : "you lose!", "indifferent" : "repeat!"] var sameMessages: Dictionary<String, String> = ["win" : "you win!", "lost" : "you lose!", "indifferent" : "repeat!"] print(gameMessages["win"]) // you win!
Optionals
Die Einführung von „Optionals“, Variablen oder Konstanten die einen Wert enthalten können aber nicht müssen („nil“ – not in list), ist eventuell etwas gewöhnungsbedürftig und kann am Anfang etwas verwirrend sein. Nichts desto trotz müssen wir uns mit dem Thema genauer Beschäftigen, da viele Klassen die wir verwenden, z.B. Cocoa Touch Klassen, optionale Werte („Optionals“) zurückliefern. Ich sehe es als Vorteil, dass Apple die Entwickler zwingt auf fehlerhafte Eingaben etc. sofort, im Code, zu reagieren, das führt auf jeden Fall zu stabilerem Code.
In Swift ist es nicht erlaubt „leere“ oder noch nicht deklarierte Klassen-Objekte zu erstellen, wie du es vielleicht aus anderen Programmiersprachen kennst:
var gameState: String // error
oder
var gameState: String = "BonusLevel" var gameState = nil // error
Wenn du ein Objekt ohne Referenz in Swift benötigst musst du Optionals verwenden, welche optional einen Wert oder „nil“ enhalten können. Die kurze Zauberformel für die Deklarierung eines „Optionals“ ist ein Fragezeichen „?“ nach dem Datentyp.
var gameState: String?
Unwrapping Optionals
Oft möchte man Variablen auch weiterverarbeiten, Berechnungen durchführen oder Zeichenketten zusammenführen etc.
var gameHintMessage:String? = "Go straight forward" let textHint = "Play hint:" let gameMessage = textHint + gameHintMessage //error
Xcode liefert uns bei diesem Beispiel einen Compiler Fehler da die Variable gameHintMessage ein Optional ist. Wenn wir uns mal den dynamicType von gameHintMessage ausgeben lassen sehen wir auch gleich warum:
print(gameHintMessage.dynamicType) //Optional<String>
Um mit dem Wert von gameHintMessage arbeiten zu können müssen wir den Optional auspacken.
var gameHintMessage:String? = "Go straight forward" let textHint = "Play hint:" let gameMessage = textHint + gameHintMessage! // unwrapp gameHintMessage with "!"
Implicit Unwrapping
Swift bietet die Möglichkeit das Auspacken von Optionals direkt bei der Deklaration zu erzwingen, wenn man sich z.B.: sehr sicher ist das eine Variable einen Wert enthält. Das passiert in Xcode automatisch wenn man Outlets oder Actions über das Storyboard verknüpft:
@IBOutlet weak var toggleCamera: UISwitch! @IBOutlet weak var displayImageView: UIImageView! var onwUnwrappedOptional: String!
Optional Binding
Das optional binding ist eine elegantere Art mit optionalen Werten zu verfahren. Indem ein optionaler Wert an eine Konstante übergeben wird überprüft ob der Wert nil ist:
var gameHintMessage:String? = "Go straight forward" let textHint = "Play hint:" if let currentGameMessage = gameHintMessage { let gameMessage = textHint + currentGameMessage }
Mit if let erstellen wir eine Konstante mit dem Namen currentGameMessage und binden diese direct an den Optional gameHintMessage. Gleichzeitig wird überprüft ob gameHintMessage nil ist oder einen Wert enthält. Falls gameHintMessage nicht nil ist, ist der Ausdruck true und der Codeblock wird ausgeführt.
Hinweis
Tuples
Mit Tuples haben wir die Möglichkeit einer Funktion mehrere Werte zurückgeben zu lassen:
func getPoints (hits:Int) -> (healthPoints: String, strengthPoints: String) { var healthPoints = hits * 2 var strengthPoints = hits * 3 return (healthPoints, strengthPoints) } let resultPoints = getPoints(13) print("Lebenspunkte: \(resultPoints.healthPoints) Stärke: \(resultPoints.strengthPoints)")
Keine Meinung