swift: Deklarasi penutupan seperti deklarasi blok


90

Kita dapat mendeklarasikan blok seperti di bawah ini di Objective-C.

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

Saya mencoba melakukan ini dengan cepat, itu memberikan kesalahan.

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

Kesalahan: Penggunaan 'completeFunction' yang tidak diumumkan

Definisi:

var completion: CompletionBlock = { }

Bagaimana cara melakukannya?

Memperbarui:

Menurut jawaban @ jtbandes, saya bisa membuat penutupan dengan banyak argumen seperti

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

1
@Downvotters: Jelaskan apa yang salah dengan pertanyaan ini?
Mani

1
Ada sejumlah orang yang merasa kita harus belajar bahasa cepat dulu baru kemudian menulis. Perasaan bodoh ...
Janak Nirmal

@Mani Hai, maukah Anda menunjukkan bagaimana Anda akan menetapkan alias jenis itu ke sebuah var(yaitu, var completion: CompletionBlock = {....}menggunakan banyak argumen? Terima kasih.
Unheilig

Jawaban:


141

The sintaks untuk jenis fungsi adalah (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) }

Perhatikan bahwa tanda kurung di sekitar tipe input hanya diperlukan pada Swift 3+.


Jika dibutuhkan lebih dari dua argumen, bagaimana kita bisa melakukannya? Maukah Anda mengarahkan saya untuk merujuk pada buku itu atau yang lainnya?
Mani

Buku terbaik untuk Swift: Apple Inc. "The Swift Programming Language." iBooks. itun.es/ca/jEUH0.l
David Skrundz

@NSArray Saya tahu hanya satu buku yang tersedia untuk swift. Tapi saya bertanya tentang bab yang sesuai dengan topik ... :)
Mani

4
@jtbandes Berhasil. Saya telah membuat dengan dua argumen sebagaitypealias CompletionBlock = ( completionName : NSString, flag : Int) -> ()
Mani

@zumzum Ini memisahkan nama parameter " reason" dari tubuh metode " println(reason)"
jtbandes

13

Berikut adalah blog yang luar biasa tentang penutupan cepat.

Berikut beberapa contohnya:

Sebagai variabel:

var closureName: (inputTypes) -> (outputType)

Sebagai variabel opsional:

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

Sebagai alias tipe:

typealias closureType = (inputTypes) -> (outputType)
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.