2016-05-15 7 views
1

私はクロージャーと関係のある小さな練習プログラムを書いた。私は、非同期の概念がどのように機能するかをよりよく理解しようとしています。私はrequest()を呼び出すしようとすると、下図のように、私は変換エラーを取得:TypeAliasをパラメータとして持つ関数を呼び出しますか?

import UIKit 

let correctPasscode = "3EyX" 

typealias CompletionHandler = (result: AnyObject?, error: String?) -> Void 

func request(passcode: String, completionHandler: CompletionHandler) { 

sendBackRequest(passcode) {(result, error) -> Void in 
    if error != nil { 
     print(error) 
    } 
    else { 
     print(result) 

    }} 

} 

func sendBackRequest(passCode: String, completionHandler: CompletionHandler) { 
if passCode == correctPasscode { 
    completionHandler(result: "Correct. Please proceed", error: nil) 

} else { 
    completionHandler(result: nil, error: "There was an error signing in") 

} 
} 


request(correctPasscode, completionHandler: CompletionHandler) // Error happens here 

enter image description here

+0

あなたのコードを共有してください。画像はありません –

+0

それを残念に編集しました。 –

答えて

3

タイプの別名を使用すると、合格するために必要なもの実際タイプあなたを伝えるためにそこにあります。 -

request(correctPasscode) { 
    (result: AnyObject?, error: String?) in 
    print("Inside the handler...") 
    // Do some useful things here 
} 

またはより短い - (

request(correctPasscode, completionHandler:{ 
    (result: AnyObject?, error: String?) in 
    print("Inside the handler...") 
    // Do some useful things here 
}) 

かさえ短い:この場合、タイプはタイプ

(result: AnyObject?, error: String?) -> Void 

の閉鎖あなたはこのようにそれを渡しています型はfunc宣言で知られている) -

request(correctPasscode) { result, error in 
    print("Inside the handler...") 
    // Do some useful things here 
} 
+0

また、末尾のクロージャの呼び出しで 'completionHandler'パラメータを省略することもできます。 –

+0

@ VictorSigler Right。ありがとう! – dasblinkenlight

+0

プログラムが何をすべきかを求める要求を呼び出そうとすると、エラーが発生します。エラー:行の連続した文は ';'で区切られていなければなりません。私は基本的にあなたが私のパラメータをrequest()で渡すために使用するように言ったコードをコピーして貼り付けました。多分私は閉鎖の仕方を誤解しているのでしょうか? –

1

私はあなたが達成しようとするのかわからないんだけど、この行:あなたが関数にCompletionHandlerクロージャを渡すのではなく型を表すタイプオブジェクトされていないため、

request(correctPasscode, completionHandler: CompletionHandler) 

がコンパイルされません。その完了ハンドラの

したがって、エラー:Cannot convert value of 'CompletionHandler.*Type*'

有効な呼び出しは次のようになります。

request(correctPasscode) { result, error in 
    print("result was \(result), and error was \(error)") 
} 

しかし、その後、あなたのrequest関数が渡されたクロージャで何もしないあなたが望むものを言うには少し難しいです...

+0

あいまいさを残して申し訳ありません。私がやっているのは、この "正しいパスコード"をsendBackRequestに送信して、パスコードが正しいかどうかを知らせていることです(私が渡した変数を割り当てたので正しいパスコードにしました)。 –

+0

私はそれを見ることができます、なぜあなたは 'sendBackRequest'をさらに別の' request'関数でラップしますか?あなたはすでに 'request'の中で' sendBackRequest'にクロージャーを渡しています。'request'の(未使用の)' completionHandler'引数の目的は何ですか? – hnh

関連する問題