web-dev-qa-db-fra.com

Passer le blocage ou la fermeture facultatif à une fonction dans Swift

Quelle est la syntaxe correcte pour passer un bloc optionnel à une fonction dans Swift?

15
Andrew Ebling

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 //
        }
    }
23
Andrew Ebling

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

11
Yevhen Dubinin

typealias ServiceResponse = (AnyObject?, String?) -> Void

fonction func (onCompletion: @scaping ServiceResponse) { éléments à écrire }

0
Farooque Azam