5 Stimmen

Verwendung der enumerateLines-Funktion von String in Swift

Die Funktion enumerateLines des Swift-Typs String ist wie folgt deklariert:

enumerateLines(body: (line: String, inout stop: Bool) -> ())

Meines Verständnisses nach bedeutet diese Deklaration: "enumerateLines ist eine Funktion, die einen Closure namens body erwartet, der zwei Variablen, line und stop, übergeben bekommt und void zurückgibt."

Laut dem Swift Programming Sprache Buch, sollte es also möglich sein, enumerateLines in einer kurzen Form mit einem abschließenden Closure aufzurufen, wie folgt:

var someString = "Hello"

someString.enumerateLines()
{
    // Hier etwas mit der Zeile machen
}

..doch das führt zu einem Compilerfehler:

Die Tupeltypen '(line: String, inout stop: Bool)' und '()' haben eine unterschiedliche Anzahl von Elementen (2 vs. 0)

Also versuche ich, die Argumente explizit anzugeben und das abschließende Closure zu entfernen:

addressString.enumerateLines((line: String, stop: Bool)
{
    // Hier etwas mit der Zeile machen
})

...doch das führt zu dem Fehler:

'(() -> () -> $T2) -> $T3' ist nicht identisch mit '(line: String.Type, stop: Bool.Type)'

Kurz gesagt, keine Syntax, die ich ausprobiert habe, führte zu einer erfolgreichen Kompilierung.

Könnte mir jemand den Fehler in meinem Verständnis zeigen und eine Syntax bereitstellen, die funktioniert, bitte? Ich verwende Xcode 6 Beta 4.

14voto

Martin R Punkte 510450

Die Schließungsausdrucksyntax hat die allgemeine Form

{ (Parameter) -> Rückgabetyp in
    Anweisungen
}

In diesem Fall:

addressString.enumerateLines ({
    (Zeile: String, inout stop: Bool) -> () in
    println(Zeile)
})

Oder unter Verwendung der Trailing-Schließungssyntax:

addressString.enumerateLines {
    (Zeile: String, inout stop: Bool) in
    println(Zeile)
}

Aufgrund automatischer Typschlüsse kann dies verkürzt werden auf

addressString.enumerateLines {
    Zeile, stop in
    println(Zeile)
}

Aktualisierung für Swift 3:

addressString.enumerateLines { (Zeile, stop) in
    print(Zeile)

    // Optional:
    if einigeBedingung { stop = true }
}

Oder, wenn Sie den "stop" Parameter nicht benötigen:

addressString.enumerateLines { (Zeile, _) in
    print(Zeile)
}

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X