Каков правильный синтаксис для передачи необязательного блока функции в 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) {материал, который нужно написать}