2016-05-27 7 views
3

Ich versuche, einige der Short-Hand-Syntax von der Kartenfunktion verwendet zu verstehen.Understanding Shorthand Closure-Syntax für Kartenfunktion in Swift

Im Folgenden ist der Aufbau

let array = [1, 2, 3] 

    // these make sense 
    let arr1 = array.map({String($0)}) 
    let arr2 = array.map{String($0)} 
    let arr3 = array.map({ number in 
     return String(number) 
    }) 
    let arr4 = array.map({ (number) -> String in 
     String(number) 
    }) 

Hier ist, wo die Verwirrung legt. In swift kann ich auf die geschweiften Klammern für Map verzichten, aber das scheint etwas zu sein, was nicht möglich ist, für meine eigenen Funktionen, wo ich einen Trailing-Closing habe. Eine magische Schlussfolgerung, die vielleicht gemacht wird? Warum wird der String auf diese Weise initialisiert?

// this doesn't make sense. Foregoing the curly braces? I can't do that!!! 
    let arr5 = array.map(String.init)  
    let arr6 = array.map(String()) // Compile Error: Cannot convert value of type 'String' to expected argument type '@noescape (Int) throws -> _' 

Dieser versucht, mich {} ähnliche Syntax wie Karte

func crap(block:(Int)-> String) { 
    print("Int to string block" + block(1)); 
} 
// works obviously 
crap{ "\($0) some garbage" } 
// compile error : Anonymous closure argument not contained in a closure 
crap("\($0) some garbage") 

Antwort

5

Unterscheiden Klammern () von geschweiften Klammern zu verwenden.

In gewissem Sinne ist nur die Klammerversion "real", weil das ja ein Funktionsaufruf erfordert. In den Klammern, wenn Sie map aufrufen, legen Sie eine Funktion. Es kann eine Funktion Referenz sein (dh der Name einer Funktion):

let arr = [1,2,3] 
    func double(i:Int) -> Int {return i*2} 
    let arr2 = arr.map(double) 

Oder es kann eine anonyme Funktion sein, eine Funktion Körper in geschweiften Klammern bedeutet:

let arr = [1,2,3] 
    let arr2 = arr.map({$0*2}) 

Aber in nur dass Fall und dieser Fall können Sie (als Abkürzung) verwenden, um die „trailing closure“ Syntax statt:

let arr = [1,2,3] 
    let arr2 = arr.map(){$0*2} 

Aber da map keine anderen Parameter nimmt, kann man dann auch weglassen die Klammern - die einzige Situation, in Swift, wo Sie eine Funktion ohne Klammern aufrufen können:

let arr = [1,2,3] 
    let arr2 = arr.map{$0*2} 
+0

Oh, ich bin ein Dummy. Ich ging einen fehlerhaften Pfad hinunter, der dachte, ich könnte einen Block zu einem Funktionsaufruf hinüberwinden. Okay danke. – Biclops