2016-04-24 8 views
1

私は構造体内に以下のようなクロージャを持っています。私はそれを実装しようとすると、クロージャの戻り値の型構文

var response: (result: Result<UserInfo>) -> Void 

struct RegisterRequest: Requestable 
{ 
    let userInfo : [String:AnyObject] 
    var response: (result: Result<UserInfo>) -> Void 
} 

は今、私は次のようにあります

let register = RegisterRequest(userInfo: userInfo, response: { (result) in 
}) 

閉鎖構文は

{ (params) -> returnType in 
    statements 
} 

なぜ迅速な自動(result) in代わりの(Void) inに私の実装を修正されている場合

答えて

1

ブロック変数responseは、タイプがResultで、Voidまたは()ではない単一のパラメータを取ることが予想されます。したがって、Xcodeは、Resultオブジェクトを表すresultという名前の引数を自動的に埋め込みます。戻り値のタイプはVoidなので、->以降のものは省略することができます。

より明示的に、それはのように書くことになります。簡単にするために

..., response: { (result: Result<UserInfo>) -> Void in 
}) 

、それが変換されます

..., response: { (result) in 
}) 

引数の周りにカッコを省略することもできます。

..., response: { result in 
}) 

ブロックに任意のパラメータを使用させたくない場合は、そのブロックのタイプを次のようになります。

var response: (Void) -> Void 
var response:() -> Void 
+0

私たちは上記と同じブロックを持ちますが、 'Model'という型を返すバージョンを持っているとします。ブロックはどのように書き直されますか? 'response:{(result) - > Model in} ' – Brosef

+0

はい、それはまさにそのように書かれています。 – ozgur

0

クロージャパラメータが戻り値の型ではないと誤解している可能性があります。

struct RegisterRequest: Requestable 
{ 
    let userInfo : [String:AnyObject] 
    var response: (result: Result<UserInfo>) -> Void 
} 

let register = RegisterRequest(userInfo: userInfo, response: { (result) in 

}) 

さらに明確にするパラメータを追加しましょう。

struct RegisterRequest: Requestable 
{ 
    let userInfo : [String:AnyObject] 
    var response: (result: Result<UserInfo>, myparam1: Int) -> Void 
} 

let register = RegisterRequest(userInfo: userInfo, response: { (result, p1) in 

}) 

そして再び:

struct RegisterRequest: Requestable 
{ 
    let userInfo : [String:AnyObject] 
    var response: (result: Result<UserInfo>, myparam1: Int, myparam2: String) -> Void 
} 

let register = RegisterRequest(userInfo: userInfo, response: { (result, p1, p2) in 

}) 

あなたはそれが既に知られているので、型が指定する必要がないことに気づくでしょう。

パラメータ名は、元の宣言と一致する必要はありません。私の例では、myparam1はクロージャー内にp1として表示されます。

+0

私は印象に残っていましたが、「in」の前に来るのは、apple closureのドキュメントのこの抜粋を元にした型です。 '{(params) - > returnType in statement }' – Brosef

+0

' - > 'はクロージャの戻り値の型です。 ' - >'の前にくるのはクロージャのパラメータです。元の質問に答えるために、Xcodeは宣言でパラメータの名前が付けられているため、 '(結果) 'を挿入します。 – ryantxr