99 Bottles of Beer (Swift)
Einfache Beispiele können helfen, sich mit neuen Programmiersprachen vertraut zu machen. In diesem Fall ist das einfache Beispiel die Ausgabe von 99 Bottles of Beer
, und die neue Programmiersprache ist Swift – die designierte Programmiersprache für Apples Plattformen.
Das folgende Listing enthält eine vollständige Implementierung in Swift. Die Anweisungen lassen sich in dieser Form gleichermaßen im Playground wie als eigenständiges Kommandozeilenprogramm ausführen. Auf Boilerplate haben die Sprachentwickler dankenswerterweise weitgehend verzichtet.
func printLyrics(#numberOfBottles: Int) {
let numeral : Int -> String = { $0 == 0 ? "no more" : String($0) }
let plural = [ false: "bottle", true: "bottles" ]
let phrase : Int -> String = { "\(numeral($0)) \(plural[$0 != 1]) of beer" }
for i in reverse(1...numberOfBottles) {
println("\(phrase(i)) on the wall, \(phrase(i)).")
println("Take one down, pass it around, \(phrase(i - 1)) on the wall.\n")
}
println("No more bottles of beer on the wall, \(phrase(0)).")
println("Go to the store and buy some more, \(phrase(numberOfBottles)) on the wall.\n")
}
printLyrics(numberOfBottles: 99)Zum Einsatz kommen bei dieser Implementierung gleich eine ganze Reihe interessanter Features, die kurz erwähnt werden sollten:
- Benannte Argumente: Mit dem Zeichen
#bei der Deklaration des formalen ParametersnumberOfBottleserzwingt der Entwickler der Funktion, dass an allen Aufrufstellen das erste und einzige Argument mit Namen übergeben werden muss. In diesem Fall ist das sinnvoll, da die Bedeutung des Arguments nicht aus dem Namen der Funktion hervorgeht. - Kompakte Lambda-Ausdrücke: Swift unterstützt mehrere Varianten für Lambda-Ausdrücke. In diesem Fall wird zweimal eine sehr kompakte Form verwendet, die lediglich aus geschweiften Klammern und der Referenzierung der Argumente mittels
$0besteht. - Collection-Literale: Für die beiden wichtigsten Collections stellt Swift eine einfache Syntax bereit. In diesem Fall wird mittels
[ false: "bottle", ... ]ein Dictionary erzeugt, das innerhalb des folgenden Lambda-Ausdrucks verwendet wird. - Lokale Typinferenz: Typen müssen für lokale Variablen häufig nicht angegeben werden, wie in diesem Beispiel für
pluralundizu sehen. Die Lesbarkeit würde sich in diesen beiden Fällen durch die Angabe der Typen nicht verbessern. Bedenken sollte man jedoch, dass dem nicht immer so ist. - String-Interpolation: In Swift lassen sich Ausdrücke in Zeichenketten einbauen, anstatt sie umgekehrt aus Fragmenten zusammenzusetzen. Das ist häufig sowohl effizienter als auch einfacher zu lesen im Vergleich zu einer naiven Zeichenkettenverknüpfung. Die Implementierung macht davon gleich mehrfach Gebrauch.
- Ranges: Swift besitzt eine spezielle Syntax für Ranges – sowohl für geschlossene als auch halb-offene. Hilfreich sind sie beispielsweise für die Realisierung von Zählschleifen, was in vielen anderen Programmiersprachen ungewöhnlich umständlich ist.
Bei all diesen Punkten sollte man sich stets vor Auge halten, dass Beispiele dieser Art keineswegs repräsentativ für die tatsächliche Softwareentwicklung sind. Swift macht in diesem Fall zwar eine gute Figur. Interessanter wäre hingegen, wie sich die Programmiersprache bei der Strukturierung größerer Projekte schlägt. Ein Thema was sicherlich eine weitere Betrachtung Wert ist.

