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) -> ()
Mani
sumber
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+.

jtbandes
sumber
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)
BLC
sumber