Guard Statement in Swift 2

Ab Swift 2 steht einem das Schlüsselwort guard zur Verfügung, welches in Ergänzung zur allseits bekannten if-Bedingung hinzugefügt wurde. Mit Hilfe von guard können Entwickler auf Bedingungen prüfen, die erwünscht sind anstatt nicht erwünscht, bedeutet: Der eigentliche Code wird nur ausgeführt, wenn die Bedingung nicht zutrifft.

Beispiel:

guard age > 21 else {
    return false
}
// Continue IF age is > 21

....

// Optional
guard let z = z where z > 0 else {
    // Requirements not met
    return false
}

// Work with z
print(z.name)

Vorteile beim Einsatz von guard:

  • Die eigentlichen Absichten des Entwicklers sind eindeutiger: Man teilt guard mit welcher Fall konkret eintreten soll.
  • Durch guard ausgepackte (=“unwrapped“) Optionals sind anschließend weiterhin verfügbar.
  • Der Code insgesamt ist kürzer und übersichtlicher (Stichwort: „Pyramid of Doom„)

Übersetzung von Storyboard-Texten

Um in Xcode Lokalisierungen bzw. Übersetzungen von (statischen) Texten im Storyboard (z.B. Menü-Punkte oder allgemein Label-Texte) zu hinterlegen, bedarf es sehr wenigen Handgriffen. Folgende Schritte sind dazu notwendig:

  • Wählt das Projekt aus und schaut ob im Tab „Info“ unter dem Punkt „Localizations“ das Häkchen bei „Use Base Internationalization“ gesetzt ist (falls nicht: setzen)
  • Durch Klick auf das Plus-Symbol (etwas oberhalb von „Use Base Internationalization„) kann eine neue Sprache hinzugefügt werden
  • Nach Bestätigung des Dialoges wurden sowohl für das Storyboard („Main.storyboard“) als auch für den Launchscreen („Launchscreen.storyboard„) eine zusätzliche String-Datei angelegt (zu erkennen an dem kleinen Dreieck neben der jeweiligen Datei)
  • In diesen Dateien befinden alle bisher existierenden Titel und Textelemente der Views und können beliebig angepasst werden
  • Möchte man die Sprache für das Storyboard („Main.storyboard“) wieder deaktivieren, muss man lediglich im „File Inspector“ unter dem Punkt „Localization“ bei der Sprache entsprechend das Häkchen entfernen (die Sprachdatei geht dann nicht verloren, sie wird lediglich nicht mehr angezeigt)

Übersetzung von Storyboard-Texten weiterlesen

Hintergrund eines TabBarItems ändern

Wie man die Navigationsleiste (bzw. NavigationBar) in Swift ändert wurde bereits einem früheren Beitrag vorgestellt. Auf gleiche Weise kann man statt der NavigationBar auch die TabBar anpassen. Dafür benutzt man anstatt der Klasse UINavigationBar einfach die Klasse UITabBar.

Etwas tricky wird es, wenn man den jeweiligen Hintergrund eines einzelnen Bar Items anpassen möchte. Swift bietet dafür (leider) keine hauseigene Methode à la setBarItemBackground. Stattdessen muss man, mit Hilfe der Methode selectionIndicatorImage, den Umweg über eine Hintergrundgrafik gehen:

func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool {
  // Set different background for selected bar item
  // 1. Assign tab bar
  let tabBarController: UITabBarController = self.window?.rootViewController as! UITabBarController
  let tabBar: UITabBar = tabBarController.tabBar

  // 2. Set background image
  tabBar.selectionIndicatorImage = UIImage(named:"selected_baritem_background")
return true
}

Der Nachteil an diesem Weg ist, dass die Hintergrunddatei theoretisch von den verschiedenen Breiten und der Anzahl der Elemente der TabBars (iPhone 5, iPhone 6, …) abhängig ist. Die Breite der iPhone 5 TabBar beträgt 320px. Bei 3 TabBarItems muss also die Hintergrundgrafik 320/3 = 106 Pixel Breit sein (Höhe beträgt 49 Pixel).

Dynamische Daten + NumberOfSections in TableView und CoreData

Ein kleines Problem was mir direkt am Anfang bei der Arbeit mit dynamischen Daten (Quelle: CoreData) und TableView auf die Füße gefallen ist, war die Angabe der Anzahl der Bereiche (=“Sections“) einer Tabelle. Hierfür stellt Swift die Methode numberOfSectionsInTableView bereit:

    override func numberOfSectionsInTableView(tableView: UITableView) -> Int {
        // Return the number of sections.
        return 1
    }

Wenn man statt der 1 eine 0 zurückgibt, existiert gar kein Bereich und man bekommt eine leere View zu sehen.