We can declare block as below in Objective-C.
typedef void (^CompletionBlock) (NSString* completionReason);
I'm trying to do this in swift, it give error.
func completionFunction(NSString* completionReason){ }
typealias CompletionBlock = completionFunction
Error : Use of undeclared 'completionFunction'
Definition :
var completion: CompletionBlock = { }
How to do this?
Update:
According to @jtbandes's answer, I can create closure with multiple arguments as like
typealias CompletionBlock = ( completionName : NSString, flag : Int) -> ()
As shown in the above table, there are three types of closures in Swift, namely global functions, nested functions, and closure expressions. They differ in several aspects, including their use scopes, their names, and whether they capture values, which will be discussed more in a later section.
Closure expressions in Swift 4 language follow crisp, optimization, and lightweight syntax styles which includes. Inferring parameter and return value types from context. Implicit returns from single-expression closures.
According to the Apple Documentation, “Closures are self-contained blocks of functionality that can be passed around and used in your code”. Closures can capture and store references to any constants and variables from the context in which they are defined.
The syntax for function types is (in) -> out
.
typealias CompletionBlock = (NSString?) -> Void
// or
typealias CompletionBlock = (result: NSData?, error: NSError?) -> Void
var completion: CompletionBlock = { reason in print(reason) }
var completion: CompletionBlock = { result, error in print(error) }
Note that the parentheses around the input type are only required as of Swift 3+.
Here is awesome blog about swift closure.
Here are some examples:
As a variable:
var closureName: (inputTypes) -> (outputType)
As an optional variable:
var closureName: ((inputTypes) -> (outputType))?
As a type alias:
typealias closureType = (inputTypes) -> (outputType)
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With