swift: Blok bildirimi gibi kapatma bildirimi


90

Objective-C'de aşağıdaki gibi blok ilan edebiliriz.

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

Bunu hızlı bir şekilde yapmaya çalışıyorum, hata veriyor.

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

Hata: Bildirilmemiş 'completeFunction' kullanımı

Tanım :

var completion: CompletionBlock = { }

Bu nasıl yapılır?

Güncelleme:

@ Jtbandes'in cevabına göre, aşağıdaki gibi birden çok argümanla kapanış oluşturabilirim

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

1
@Downvotters: Lütfen bu sorunun ne olduğunu açıklayın?
Mani

1
Bir çok insan önce hızlı bir dil öğrenip sonra yazmamız gerektiğini düşünüyor. Aptalca duygular ...
Janak Nirmal

@Mani Merhaba, ayrıca bir o tip takma atamak nasıl gösterebilir misin varyani ( var completion: CompletionBlock = {....}? Çoklu argümanlar kullanarak teşekkür ederiz.
Unheilig

Yanıtlar:


141

Fonksiyon türleri için sözdizimi olduğunu (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) }

Giriş türünün etrafındaki parantezlerin yalnızca Swift 3+ sürümünden itibaren gerekli olduğuna dikkat edin.


İkiden fazla argüman gerektiriyorsa, bunu nasıl yapabiliriz? Lütfen beni o kitapta veya başka bir yerde referans göstermeye yönlendirir misiniz?
Mani

Swift için en iyi kitap: Apple Inc. "The Swift Programming Language." iBooks. itun.es/ca/jEUH0.l
David Skrundz

@NSArray Sadece bir kitabın hızlı bir şekilde kullanılabileceğini biliyorum. Ama konuya karşılık gelen bölümü soruyorum ... :)
Mani

4
@jtbandes Çalışıyor. Şu iki bağımsız değişkenle oluşturdumtypealias CompletionBlock = ( completionName : NSString, flag : Int) -> ()
Mani

@zumzum " reason" parametre adını yöntem gövdesinden " println(reason)"
ayırır

13

İşte hızlı kapanışla ilgili harika bir blog.

İşte bazı örnekler:

Değişken olarak:

var closureName: (inputTypes) -> (outputType)

İsteğe bağlı bir değişken olarak:

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

Tür takma adı olarak:

typealias closureType = (inputTypes) -> (outputType)
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.