Funktionale Programmierung in Swift: von A bis Z – vollständiger Leitfaden

Online Python-Trainer für Anfänger

Lernen Sie Python einfach ohne theoretische Überlastung. Lösen Sie praktische Aufgaben mit automatischer Überprüfung und schreiben Sie Code direkt im Browser.

Kurs starten

Funktionale Programmierung in Swift: von A bis Z



Funktionale Programmierung (FP) ist ein Paradigma, das Berechnungen als Auswertung mathematischer Funktionen betrachtet und Zustandsänderungen sowie veränderliche Daten vermeidet. Swift, als multiparadigmatische Sprache, unterstützt den funktionalen Stil hervorragend, insbesondere bei der Entwicklung für iOS und macOS. In diesem Artikel gehen wir den Weg von grundlegenden Konzepten bis hin zu fortgeschrittenen Techniken wie Monaden und Funktionskomposition.



Grundlagen des funktionalen Ansatzes in Swift



Im Kern der funktionalen Programmierung liegen mehrere Schlüsselprinzipien:



  • Reine Funktionen – das Ergebnis hängt nur von den Eingabeargumenten ab, ohne Nebeneffekte.
  • Unveränderlichkeit von Daten – Verwendung von let anstelle von var.
  • Funktionen als Erstklassige Bürger – sie können übergeben, zurückgegeben und gespeichert werden.


Schauen wir uns ein einfaches Beispiel einer reinen Funktion an:



// Reine Funktion: keine Nebeneffektefunc add(_ a: Int, _ b: Int) -> Int {    return a + b}

// Verwendunglet result = add(3, 5) // 8print(result)


Closures und Funktionen höherer Ordnung



Closures sind in sich geschlossene Funktionsblöcke, die im Code übergeben und verwendet werden können. Sie sind die Grundlage für die Arbeit mit Funktionen höherer Ordnung.



// Einfaches Closurelet multiply = { (x: Int, y: Int) -> Int in    return x * y}

let product = multiply(4, 7) // 28print(product)


Swift bietet leistungsstarke Funktionen höherer Ordnung für die Arbeit mit Sammlungen:



map

map wendet eine Transformation auf jedes Element eines Arrays an:



let numbers = [1, 2, 3, 4, 5]let squared = numbers.map { $0 * $0 }print(squared) // [1, 4, 9, 16, 25]


filter

filter wählt Elemente aus, die eine Bedingung erfüllen:



let evenNumbers = numbers.filter { $0 % 2 == 0 }print(evenNumbers) // [2, 4]


reduce

reduce kombiniert alle Elemente zu einem einzigen Wert:



let sum = numbers.reduce(0, +)print(sum) // 15


Funktionskomposition und Currying



Komposition ermöglicht es, einfache Funktionen zu komplexeren zu kombinieren. Swift hat keinen eingebauten Kompositionsoperator, aber er lässt sich leicht implementieren:



// Kompositionsoperatorprecedencegroup CompositionPrecedence {    associativity: left    higherThan: AssignmentPrecedence}

infix operator >>>: CompositionPrecedence

func >>> <A, B, C>(left: @escaping (A) -> B, right: @escaping (B) -> C) -> (A) -> C { return { right(left($0)) }}

// Verwendungfunc double(_ x: Int) -> Int { x * 2 }func toString(_ x: Int) -> String { "\\(x)" }

let doubleThenString = double >>> toStringprint(doubleThenString(5)) // "10"


Currying ist die Umwandlung einer Funktion, die mehrere Argumente akzeptiert, in eine Folge von Funktionen, die jeweils ein Argument akzeptieren:



// Normale Funktionfunc add(_ a: Int, _ b: Int) -> Int { a + b }

// Curry-Versionfunc curriedAdd(_ a: Int) -> (Int) -> Int { return { b in a + b }}

let addFive = curriedAdd(5)print(addFive(3)) // 8


Monaden und Funktoren in Swift



In der funktionalen Programmierung ist ein Funktor ein Typ, der abgebildet (map) werden kann. Eine Monade ist ein Funktor mit einer zusätzlichen flatMap-Operation (oder >>=). Das bekannteste Beispiel in Swift sind Optional und Array.



Optional als Monade



let optionalValue: Int? = 5

// map – wendet eine Funktion an, wenn der Wert nicht nil istlet doubled = optionalValue.map { $0 * 2 }print(doubled) // Optional(10)

// flatMap

Blogs

Buchempfehlungen