Ergänzen fehlender Xcode-Funktionen - Teil 3

9. November 2016

Nach Teil 1 und Teil 2 unserer Serie über fehlende Xcode Funktionen und wie man sich behelfen kann, folgen in diesem Eintrag mehr Informationen zu Fehlenden Code Conventions und TODO-Warnungen.

Fehlende Code Conventions und TODO-Warnungen

Swift erlaubt es - wie die meisten Programmiersprachen - das gleiche Funktionsverhalten einer App auf viele verschiedene Weisen zu implementieren. Während man im Allgemeinen nicht sagen kann, dass es "die perfekte" Implementierung einer Funktion gibt, kristallisieren sich dennoch mit der Zeit für jede Programmiersprache und Plattform eine ganze Menge von zu vermeidenden und eher zu bevorzugenden Implementierungen heraus. Um möglichst hohe Code-Qualität zu erreichen, lohnt es sich daher für jede längerfristig angelegte Arbeit – besonders wenn mehrere Entwickler beteiligt sind – Code-Konventionen zu erarbeiten und sich an diesen zu orientieren.

Während das offizielle Buch der Swift-Entwickler The Swift Programming Language beim Erläutern der einzelnen verfügbaren Funktionen bereits viele sinnvolle Beispiele für guten Programmierstil vorgibt, ist es diesbezüglich doch eher zu zeitaufwändig und unvollständig (wenn auch trotzdem lesenswert). Als offizielle Apple-Quelle seien ergänzend die API Design Guidelines empfohlen. Als bessere Alternative gibt es die zusammengefassten und mit Beispielen versehenen Swift Code Conventions von GitHub und von raywenderlich.com, an die auch wir uns bei Jamit Labs halten.

Das Open Source Projekt SwiftLint hat es sich zur Aufgabe gemacht, die GitHub Conventions automatisiert in Xcode zu überprüfen. Nach einer Installation des SwiftLint-Tools via Homebrew (brew install swiftlint), kann nun jedes Projekt durch drei einfache Schritte um einen automatisierten Warnings- und Error-Generator bei Nichteinhaltung von bestimmten Code-Konventionen erweitert werden:

  • Füge ein Build-Script mit diesem Inhalt für das App- oder Framework-Target hinzu:
if which swiftlint > /dev/null; then
    swiftlint
else
    echo "warning: SwiftLint not installed, download it from https://github.com/realm/SwiftLint"
fi

Hinweis: Man beachte, dass beim Einfügen des Scripts in das Build-Script-Feld in Xcode die Formatierung des Textes verloren geht. Diese lässt sich mit ein paar Einrückungen jedoch schnell wieder herstellen, um den Code im Script lesbarer zu halten.

  • Erstelle danach im Hauptverzeichnis des Projekts eine Datei namens .swiftlint.yml mit folgender Konfiguration (bei Bedarf änderbar):
# some rules are only opt-in
opt_in_rules:
- empty_count
- missing_docs

# paths to include during linting. `--path` is ignored if present.
included:
- Sources

# paths to ignore during linting. Takes precedence over `included`.
excluded:
- Carthage
- Sources/Constants

# configurable rules can be customized from this configuration file
line_length: 180

Als drittes sollte nun noch eine Einstellung von Xcode angepasst werden, da die Regel trailing_newline sonst beim Standardverhalten von Xcode Warnungen wegen falsch gesetzter Leerzeichen meldet, die man ganz einfach vermeiden kann: Gehe in die Einstellungen von Xcode ("Preferences"), wähle dort den Reiter "Text Editing" und stelle sicher, dass neben "Automatically trim trailing whitespace" auch "Including whitespace-only lines" angehakt ist. Dies stellt sicher, dass bei Umbrüchen und leer gelassenen Zeilen entstehende Leerzeichen automatisch gelöscht werden. Hier kann übrigens auch gleich die Empfehlungslinie für die Zeilenbreite in Xcode angepasst werden unter "Page guide at column" - wir empfehlen 180 als Kompromiss zwischen ständigen Zeilenumbrüchen und Lesbarkeit von Code.

Diese drei Schritte sorgen dafür, dass bei jedem Entwickler, der den Swift Linter installiert hat, automatisch Warnungen oder in bestimmten Fällen sogar Errors in Xcode generiert und angezeigt werden, wenn die konfigurierten Konventionen nicht eingehalten werden. Falls jemand das Tool SwiftLint nicht installiert hat, wird wenigstens eine Warnung angezeigt, dass der Swift Linter nicht installiert ist. Als netten Nebeneffekt zeigt SwiftLint zusätzlich auch Code-Kommentare, die ein TODO: oder FIXME enthalten als Warnungen an, damit man diese nicht so schnell vergessen oder übersehen kann.

Weiterführende Links