'da isteğe bağlı bir bloğu veya bir işlevi kapatmak için geçiş yapma İsteğe bağlı bir bloğu Swift'deki bir işleve iletmek için doğru sözdizimi nedir?Swift
Q
Swift
12
A
cevap
21
Objective-C blok sözdizimi olarak hatırlamak zor olmasa da, açıktan çok uzaktır. notConnected
parametre bu örnekte isteğe bağlıdır:
func whenConnected(block: Void -> Void, notConnected: ((Void) -> Void)?, showErrorMessage: Bool) -> Void {
let connected = Reachability.isConnectedToNetwork()
if connected {
block()
} else {
notConnected?()
}
if showErrorMessage {
// your error handling //
}
}
+0
İyi nokta - teşekkürler. Cevap buna göre güncellendi. –
10
Ben (aşağıdaki bağlantıya bakınız) örneğini bulundu ve benim projede typealias
kullanmak için güncellenmiştir.
Swift 3:
import Foundation
typealias CompletionBlock = (NSError?) -> Void
var completionBlock: CompletionBlock?
// a function declaration w/ optional closure param and default value
func doSomething(completion: CompletionBlock? = nil) {
// assign to the property, to call back out of this function's scope
completionBlock = completion
// ...
// optional closure callback
completionBlock?(nil)
// ...
}
func doSomethingElse() {
// 1. pass optional (nil) closure to a function
doSomething()
// 2. pass optional (non-nil) closure to a function
doSomething(completion: { (error) -> Void in
print("error: \(error)")
})
}
Kaynak: Optional trailing closures in Swift
NOT: completion
isteğe bağlı kapanma olarak ilan edildiğinden, her zaman kaçar. Bunun hakkında daha fazla bilgi için: Optional Non-Escaping Closures
olası bir kopyası [Nasıl hızlıca isteğe bağlı bir kapatma yapar?] (Http://stackoverflow.com/questions/24395853/how-does-one-make-an-optional-closure- in-swift) –
Aynı bilgiyi kapsar, ancak bir Objective-C geliştiricisi, yanıtı "kapatma" yerine "blok" aramanın sonucunda (benim yapmadığım gibi) bulamaz. Kapatma elbette doğru Swift terminolojisidir. –