//1. Closure : Capturing value
func makeIncrement( forIncrement amount: Int) -> ()->Int {
var sum = 0 // this is captured value
func add () -> Int {
sum += amount
return sum
}
return add
}
let incrementBy5 = makeIncrement(forIncrement:5)
print(incrementBy5())
print(incrementBy5())
let incrementBy3 = makeIncrement(forIncrement:3)
print(incrementBy3())
print(incrementBy3())
//Closures are Reference Type
let incrementTemp = incrementBy3
print(incrementTemp())
//2. Closure : Escaping Closures
/*
A closure is said to escape a function when the closure is passed as an argument to the function, but is called after the function returns.
*/
var completionHandlers: [() -> Void] = []
func someFunctionWithEscapingClosure(completionHandler: @escaping () -> Void) {
completionHandlers.append(completionHandler)
// closure is not called in this scope. @escaping required
// completionHandler() // closure is called in this scope. @escaping not required
}
func someFunctionWithNonescapingClosure(closure: () -> Void) {
closure()
}
class SomeClass {
var x = 10
func doSomething() {
someFunctionWithEscapingClosure { self.x = 100 }
someFunctionWithNonescapingClosure { x = 200 }
}
}
let instance = SomeClass()
instance.doSomething()
print(instance.x)
// Prints "200"
completionHandlers.first?()
print(instance.x)
// Prints "100”
2017년 2월 17일 금요일
Swift closure : Capturing value, Escaping Closures
피드 구독하기:
댓글 (Atom)
댓글 없음:
댓글 쓰기