私たちは、コードがメインスレッドをブロックしないようにするために、モバイルデバイス上で多くの非同期作業を行います。 以前は多くのデリゲートメソッドを意味していましたが、Objective-Cの最近の進歩により、完了ハンドラとしてブロックに値を返すことができました。 間違いなく、swiftでも多くのことを行う必要があります。

完了ブロックパターンとそれを使用するための関連する構文を使用するObjective-Cの関数定義は次のとおりです:

- (void)hardProcessingWithString:(NSString *)input withCompletion:(void (^)(NSString *result))block;;

ブロック構文をありがとう! 私はこのようなものを覚えていることはできません

Swiftは、付け足しの言語を追加する必要がないため、これを改善する機会が与えられています。

結果は複雑に見えるかもしれません(関数内のすべての関数宣言のように)が、実際には単純です。 これは、ネストを理解している限り、関数を引数として取る単なる関数定義なので、これはすぐに明確になるはずです:

func hardProcessingWithString(input: String, completion: (result: String) -> Void) {...completion("we finished!")}

ここでの補完クロージャは、文字列を受け取り、voidを返す単なる関数です。 最初はこれが後方に聞こえます-これは引数として文字列を取りますか? 文字列を返したい! -しかし、私たちは本当に文字列を返したくない、それは私たちが戻るまで私たちがブロックしたことを意味します。 代わりに、呼び出し先が私たちに与えた関数を呼び出し、関連する引数を提供しています。

swiftチームからの関数呼び出しを短くする巧妙な方法のおかげで、完了ハンドラを使用する方が宣言するよりも簡単です:

hardProcessingWithString("commands") {(result: String) inprint("got back: \(result)")}

これは末尾のクロージャであり、最後の引数がクロージャであるときはいつでも使用できるものです。 やや奇妙な{() in }構文を使用すると、非同期関数でクロージャを渡した結果が魔法のように返されます。 私は本当にこの構文を何にするのかを理解するためにswiftの深さをまだ垂直にしていませんが、今のところ私はそれがうまくいくことをうれしく思

コメントを残す

メールアドレスが公開されることはありません。