728x90
클로저
클로저란 특정 기능을 담은 코드를 블럭으로 모아둔 형태이자, 일급 객체로 완벽한 역할을 할 수 있습니다.
일급 객체란 전달 인자로 보낼 수 있고, 변수/상수 등으로 저장하거나 전달할 수 있으며, 함수의 반환 값이 될 수도 있습니다. 실제 우리가 알고 있는 함수는 클로저의 한 형태로, 이름이 있는 클로저입니다.
기본 형태
{ (매개 변수들) -> 반환 타입 in
실행 코드
}
Basic Closure
let simpleClosure = {
print("This is SimpleClosure!!")
}
simpleClosure()
let closureParameter = { (str: String) -> Int in
return str.count
}
let count = closureParameter("Swift")
print(count)
func voidFunction() {
print("1")
}
let var1 = voidFunction
let var2: ()->() = {
print("1")
}
var1()
var2()
Inline Closure
let add: (Int, Int) -> Int
add = { (a: Int, b: Int) -> Int in
return a + b
}
add(3,5) // 8
func calculate(a: Int, b: Int, completion: (Int, Int) -> Int) -> Int {
return completion(a,b)
}
calculate(a: 10, b: 50, completion: add) // 60
var calcValue = calculate(a: 20, b: 30, completion: { (left: Int, right: Int) -> Int in
return left * right
})
print(calcValue) // 600
Trailing Closure
클로저가 메서드의 마지막 전달 인자일때 마지막 매개변수 이름을 생략한 후 소활호 메서드 소괄호 외부에 클로저를 구현할 수 있습니다.
위의 Inline Closure에서 calculate를 Trailing Closure로 만들어 보겠습니다.
//Inline Closure
calculate(a: 20, b: 30, completion: { (left: Int, right: Int) -> Int in
return left * right
})
//Trailing Closure
calculate(a: 10, b: 20) { (left, right) -> Int in
return left * right
}
단축 인자이름을 활용할 수 있습니다
단축 인자이름은 클로저의 매개변수의 순서대로 $0, $1, $2... 처럼 표현해서 사용할 수 있습니다.
//컴파일러가 타입을 알고 있기 때문에 단축 인자 이름을 활용할 수 있습니다.
calculate(a: 10, b: 20) {
return $0 * $1
}
//컴파일러가 리턴 타입을 알고 있기 때문에
//암시적 반환 표현으로 return을 쓰지 않고 암시적으로 반환을 취급합니다.
calculate(a: 10, b: 20) {
$0 * $1
}
calculate(a: 10, b: 20) { $0 * $1 }
이해를 위해 클로저 단축 문법을 살펴보겠습니다.
Syntax Optimization
func performClosure(param: (String) -> Int) {
print(param("swift"))
}
performClosure(param: { (str: String) -> Int in
return str.count
})
performClosure(param: { (str: String) in
return str.count
})
performClosure(param: { str in
return str.count
})
performClosure(param: {
return $0.count
})
performClosure(param: {
$0.count
})
performClosure(param: ) {
$0.count
}
performClosure() {
$0.count
}
performClosure { $0.count }
'Swift' 카테고리의 다른 글
[Swift] Closure - 3 (NoEscaping, Escaping, AutoClosure) (0) | 2019.07.22 |
---|---|
[Swift] Closure - 2 (Capturing) (0) | 2019.07.22 |
[Swift] 옵셔널(Optionals) (0) | 2019.07.22 |
[Swift] 접근제어(Access Control) (0) | 2019.07.20 |
[Swift] 프로퍼티(Property) (0) | 2019.07.19 |