swift : Closure declaration as like block declaration

IosSwift

Ios Problem Overview


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) -> ()

Ios Solutions


Solution 1 - Ios

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+.

Solution 2 - Ios

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)

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionManiView Question on Stackoverflow
Solution 1 - IosjtbandesView Answer on Stackoverflow
Solution 2 - IosBLCView Answer on Stackoverflow