728x90
1 Closure
- closure는 크게 global함수, nested 함수, closure expression 세가지가 있다.
- 쉽게는 이름없는 함수라고 이해하면 된다.
- 함수처럼 변수에 할당할 수 있다.
- 변수에 할당할 수 있고 인자를 받아 결과를 리턴할 수 있는 타입을 First Class Type이라고 하는데 closure는 이에 해당한다.
- closure로 두 숫자를 받아서 곱해주는 함수를 정의해보자
- 다양한 축약형이 가능하다.
var multiplyClosure: (Int, Int) -> Int = { (a: Int, b: Int) -> Int in
return a * b
}
var multiplyClosure2: (Int, Int) -> Int = { a, b in
return a * b
}
var multiplyClosure3: (Int, Int) -> Int = { return $0 * $1 }
multiplyClosure(4, 2)
- 아래 처럼 input과 output이 없는 closure도 정의 가능하다.
let voidClosure: () -> Void = {
print("Void closure")
}
- 개발에 있어서 closure를 Parameter로 받는 형태가 많이 나온다.
var multiplyClosure: (Int, Int) -> Int = { a, b in
return a * b
}
func operateTwoNums(a: Int, b:Int, operation: (Int, Int) -> Int) -> Int {
let result = operation(a,b)
return result
}
operateTwoNums(a: 3, b: 4, operation: multiplyClosure)
- 이번에는 인자로 closure를 미리 만들어 놓고 넘기지 말고 closure를 즉석에서 만들어보자.
func operateTwoNums(a: Int, b:Int, operation: (Int, Int) -> Int) -> Int {
let result = operation(a,b)
return result
}
operateTwoNums(a: 3, b: 4) { a, b in
return a*b
}
func calculator(operation: () -> Void ) {
print("function called")
operation()
}
calculator(operation: {
print("pass closure as parameter")
})
- 좀더 짧게 쓰기 위해 operateTwoNums처럼 calculator에서도 "operation:"을 생략할 수 있다. 이를 trailing closure라고 한다.
2 Capturing Value
- 아래 예시를 보면서 이해해보자.
var count = 0;
let incrementer = {
count += 1;
}
incrementer()
incrementer()
count
- incrementer는 자기의 scope를 벗어난 변수에 접근을 하고 있다.
- 원래대로라면 scope를 벗어난 변수는 참조할 수 없지만 이 변수를 closure로 capture하면 스코프를 벗어나도 변수의 값을 사용하고 변경할 수 있다.
728x90
반응형
'ComputerScience > ios App(Storyboard)' 카테고리의 다른 글
ios - 11 swift 기본문법(Class) (0) | 2021.07.25 |
---|---|
ios - 10 swift 기본문법(Structure) (0) | 2021.07.22 |
ios - 8 swift 기본문법(Array, Dictionary, Set) (0) | 2021.07.21 |
ios - 7 swift 기본문법(Function, Optional) (0) | 2021.07.15 |
ios - 6 swift 기본문법(Tuple, Flow Control) (0) | 2021.01.28 |