swift:ブロック宣言のような閉鎖宣言


90

Objective-Cでは以下のようにブロックを宣言できます。

typedef void (^CompletionBlock) (NSString* completionReason);

私はこれを迅速に実行しようとしていますが、エラーが発生します。

func completionFunction(NSString* completionReason){ }
typealias CompletionBlock = completionFunction

エラー:宣言されていない「completionFunction」の使用

定義:

var completion: CompletionBlock = { }

これを行う方法?

更新:

@jtbandesの回答によると、私は次のように複数の引数を持つクロージャーを作成できます

typealias CompletionBlock = ( completionName : NSString, flag : Int) -> ()

1
@Downvotters:この質問の何が問題になっているのですか?
Mani

1
最初に迅速な言語を学び、それから書くべきだと感じている人がたくさんいます。愚かな気持ち...
Janak Nirmal 2014年

@Maniこんにちは、あなたはまた、あなたがそのタイプの別名を割り当てます方法を示していただけませんvar(すなわち、var completion: CompletionBlock = {....}?ありがとうを複数の引数を使用して。
Unheilig

回答:


141

関数タイプ構文(in) -> outです。

typealias CompletionBlock = (NSString?) -> Void
// or
typealias CompletionBlock = (result: NSData?, error: NSError?) -> Void
var completion: CompletionBlock = { reason in print(reason) }
var completion: CompletionBlock = { result, error in print(error) }

入力タイプを囲む括弧は、Swift 3以降でのみ必要であることに注意してください。


3つ以上の引数を取る場合、どうすればよいですか?その本やその他の参考文献を教えていただけませんか?
Mani

Swiftのベストブック:Apple Inc.「The Swift Programming Language」iBooks。itun.es/ca/jEUH0.l
David Skrundz

@NSArray迅速に入手できるのは1冊の本だけだと知っています。しかし、私はトピックの対応する章について尋ねています... :)
Mani

4
@jtbandes動作しています。私は次の2つの引数を使用して作成しましたtypealias CompletionBlock = ( completionName : NSString, flag : Int) -> ()
Mani

@zumzumパラメータ名 " reason"をメソッド本体 " println(reason)" から分離します
jtbandes

13

ここに迅速な閉鎖についての素晴らしいブログがあります。

ここではいくつかの例を示します。

変数として:

var closureName: (inputTypes) -> (outputType)

オプションの変数として:

var closureName: ((inputTypes) -> (outputType))?

タイプエイリアスとして:

typealias closureType = (inputTypes) -> (outputType)
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.