In iOS Swift Blocks (Closures) Tutorial, I have explained about iOS Swift Closures (Blocks) syntax, features and usage with examples.
Swift Closures are self-contained blocks of functionality that can be passed around and used in your code. Closures in Swift are similar to blocks Objective-C and have some extra features.
Below are topics covered in this article:
1) Swift Blocks (Closures) Syntax
2) Declaring Swift Closures
3) Passing blocks as function arguments
1) Swift Blocks (Closures) Syntax
Closures can use constant parameters,variables,and in-out parameters similar to functions. Closures stars with { and ends with }.
{ (Parameters) -> ReturnType in statements }
Note: in is a keyword
2) Declaring Swift Closures
Below is a simple swift block, without any arguments and without return value.
var clos1 = { () -> Void in println("Simple Closure") } clos1()
Blocks with arguments and without any return value
var print1 = { (str:String) -> Void in println(str) } print1("Ravi")
Blocks with arguments and with return values.
var max = { (num1:Int,num2:Int) -> Int in return num1 > num2 ? num1 : num2 } println("Max of 10,2 : \(max(10,2))")
3) Passing blocks as function arguments
You can pass blocks as function parameters similar to objective-C.
To discuss more about Swift Blocks features,Let us take an example mySort() function which takes integer array return sorted array using comparator.
func mySort(inout numbers:Int[],compare:((Int,Int)->Bool)) { //Write your login to sort numbers using comparator method var tmp:Int var n = numbers.count for(var i=0;i<n;i++) { for(var j=0;j<n-i-1;j++) { if(numbers[j] > numbers[j+1]) { tmp=numbers[j]; numbers[j]=numbers[j+1]; numbers[j+1]=tmp; } } } } var numbers = [10,1,20,123,50] mySort(&numbers,{ (num1:Int,num2:Int) -> Bool in return num1 > num2 })
Swift provides simpler way of writing closure expressions.
Inferring Type from Context:
Swift infers parameter and return value types from context. So you need not specify the return types and argument types. So the above block is simply written as
var sorted2 = mySort(numbers,{ n1,n2 in return n1 > n2})
Implicit returns from single-expression closures:
Single-expression closures can implicitly return the result of their single expression by omitting the return keyword from their declaration.
var sorted3 = mySort(numbers){ n1,n2 in n1 > n2}
Shorthand argument names:
Swift provides automatically shorthand arguments. arguments are accessed by $0,$1…$n
var sorted4 = mySort(numbers,{ $0 > $1})
Operator Functions:
More shorter way of writing closure expression is using operator functions.
var sorted5 = mySort(numbers,>)
Trailing closure syntax:
Trailing closure is a closure expression that is written after the parenthesis of the function call.
var sorted6 = mySort(numbers){ (num1:Int,num2:Int) -> Bool in return num1 > num2 } var sorted7 = mySort(numbers) { $0 > $1}
Reference: Apple Documentation