2016-05-27 15 views
3

マップ関数で使用される簡略構文の一部を理解しようとしています。Swiftのマップ関数の短縮形クロージャ構文の理解

次は混乱が産むのはここ

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) 
    }) 

がある設定です。迅速に私はマップの中括弧を捨てることができますが、これはできないことのように思えます。おそらく作られている魔法の推論は?また、なぜこのように文字列が初期化されるのですか?

// 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 -> _' 

これは

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") 

答えて

5

は、中括弧{}から括弧()を区別するマップと同様の構文を使用しようとしている私です。

ある意味では、カッコのバージョンだけが「実際」です。なぜなら、それは関数呼び出しに必要なものだからです。かっこ内でmapに電話すると、関数が置かれます。

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

それともそれは中括弧で関数本体を意味し、匿名関数とすることができる:

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

しかしでは機能参照(関数の名前)とすることができますその場合、その場合にのみ、あなたは(ショートカットとして)の代わりに「末尾の閉鎖」の構文を使用できます。

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

mapは、他のパラメータを取りませんので、しかし、あなたはその後もは、括弧を省略することができます - あなたは括弧なしで関数を呼び出すことができスウィフトで唯一の状況を:

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

ああ、私はダミーです。私は、ブロックを関数呼び出しに振り回すことができると思った誤った道を下った。よろしくお願いします。 – Biclops