Quelle est la syntaxe correcte pour passer un bloc optionnel à une fonction dans Swift?
Bien que cela ne soit pas aussi difficile à retenir que la syntaxe de bloc Objective-C, c'est loin d'être évident. Le paramètre notConnected
est facultatif dans cet exemple:
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 //
}
}
J'ai trouvé l'exemple de celui-ci (voir lien ci-dessous) et je l'ai modifié pour utiliser typealias
dans mon projet.
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)")
})
}
Source: Fermetures de fuite optionnelles dans Swift
NOTE: La completion
étant déclarée comme une fermeture optionnelle, elle toujours échappe . Plus à ce sujet: Fermetures optionnelles non-évasives
typealias ServiceResponse = (AnyObject?, String?) -> Void
fonction func (onCompletion: @scaping ServiceResponse) { éléments à écrire }