2016-09-25 6 views
0

私は迅速に新しいです。閉鎖のような関数を宣言closures
を理解しようと」してみましょう:迅速なコンテキストは何ですか?

let sayHello = { 
    return "hello" 
} 

クロージャを推測することができないが、現在のコンテキスト(の型を返す) - >()

私の質問が何であるかここにあります文脈?

let sayHello : String = { 
     return "hello" 
    } 

機能、「文字列」の予期される型を作るあなたは(とそれを呼び出すことを意味しなかった)

正直私はこのエラーを理解していませんでしたか?誰も私に理解を助け、なぜこの1つを指定する必要がありますか()

しかし、これは正常に動作していると、エラーなしで、それは閉鎖

let sayHello : String = { 
      return "hello" 
     }() 

と呼ばれる

答えて

1

コンテキストをありがとうございましたエラーメッセージは、その周囲に伴い閉鎖のための初期化ステートメントを、意味を指します。

スウィフトはしばしばを推測することができます。(明示していることから分かります)クロージャのタイプは明示的に指定する必要はありません。

例えば、クロージャーを引数としてIntとする関数を呼び出す場合、Swiftはクロージャの引数の型がIntである必要があると判断します。同様に、閉包がキャプチャされたローカル変数Stringを返した場合、Swiftは戻り値の型を指定する必要はありません。なぜなら、数値はStringでなければならないからです。

将来の使用のためにクロージャを作成し、それらを変数に割り当てるとき、これは動作しません。今、あなたは(すなわち()->String閉鎖)「引数を取らず、Stringを返すクロージャを」型の変数sayHelloを持って

let sayHello :()->String = { 
    return "hello" 
} 

を:そのような状況では、あなたが作成しているクロージャの種類スウィフトを伝える必要があります。あなたが挨拶し、後でそれを呼び出すことができます。

let hello = sayHello() 

注:「働いた」というあなたの例では、閉鎖を定義しました。しかし、クロージャーはその定義の直後に使用され、その後破棄されました。

+0

単一の式クロージャは、その型を推論することができます(例: 'let sayHello = {return" hello "}')。 – Hamish