Передайте дополнительный блок или закрытие функции в Swift

Каков правильный синтаксис для передачи необязательного блока функции в Swift?

Ответ 1

Хотя не так сложно запомнить, как синтаксис блока Objective-C, это далеко не очевидно. Параметр notConnected является необязательным в этом примере:

    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 //
        }
    }

Ответ 2

Я нашел его пример (см. ссылку ниже) и изменил его, чтобы использовать typealias в моем проекте.

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 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)")
    })
}

Источник: Дополнительные закрывающие закрытия в Swift

ПРИМЕЧАНИЕ.. Поскольку completion объявляется как необязательное закрытие, он всегда выполняет. Подробнее об этом: Дополнительные блокировки без экранирования

Ответ 3

typealias ServiceResponse = (AnyObject?, String?) → Void

запрос func (onCompletion: @escaping ServiceResponse) {материал, который нужно написать}