DAY 11
클로저(Closure)
클로저 표현식
클로저란? 익명 함수
C, C++, Objective-C의 block
Java Lambda function
C# Delegates
클로저 표현식은 독립적인 코드 블록
func add(x: Int, y: Int) -> Int {
return(x+y)
}
print(add(x:10, y:20))
let add1 = { (x: Int, y: Int) -> Int in
return(x+y)
}
print(add1(10, 20))
클로저 표현식은 매개변수를 받거나, 값을 반환하도록 만들 수도 있음
{(<매개변수 이름>: <매개변수 타입>, ...) -> <반환 타입> in
// 클로저 표현식 코드
}
후행 클로저(trailing closure)
클로저가 함수의 마지막 argument라면 마지막 매개변수 이름을 생략한 후 함수 소괄호 외부에 클로저를 구현
convenience init(title: String?, style:
UIAlertAction.Style, handler: ((UIAlertAction) -> Void)? = nil)
// 일반 클로저 표현식
let removeAction = UIAlertAction(title: "제거", style: UIAlertAction.Style.destructive, handler: {
ACTION in self.lampImg.image = self.imgRemove
self.isLampOn=false
})
// 후행 클로저 표현
let onAction = UIAlertAction(title: "On", style:
UIAlertAction.Style.default) {
ACTION in self.lampImg.image = self.imgOn
self.isLampOn=true
}
함수의 마지막 argument를 생략한 후 함수 소괄호 외부에 클로저를 구현하여 더 깔끔하게 표현할 수 있는 것을 볼 수 있었음
다양한 클로저 표현들
let add = {(val1: Int, val2: Int) -> Int in
return val1 + val2
}
result = add(10, 20)
일반적인 function으로 표현
func math(x: Int, y: Int, cal: (Int, Int) -> Int) -> Int {
return cal(x, y)
}
result = math(x: 10, y: 20, cal: add)
closure 표현
일반적인 closure
result = math(x: 10, y: 20, cal: {(val1: Int, val2: Int) -> Int in
return val1 + val2
})
trailing closure
result = math(x: 10, y: 20) {(val1: Int, val2: Int) -> Int in
return val1 + val2
}
리턴형 생략
당연히 Int형으로 반환할 것을 알고 있기 때문에, -> Int 를 생략하여도 자동으로 만들어 준다
result = math(x: 10, y: 20, cal: {(val1: Int, val2: Int) in
return val1 + val2
})
trailing closure, 리턴형 생략
result = math(x: 10, y: 20) {(val1: Int, val2: Int) in
return val1 + val2
}
매개변수 생략 및 단축인자(shorthand argument name) 사용
단축인자 $ 는 0부터 시작하며, 위치의 절대값으로 매개변수를 표현한다
result = math(x: 10, y: 20, cal: {
return $0 + $1
})
trailing closure, 매개변수 생략 및 단축인자 사용
result = math(x: 10, y: 20) {
return $0 + $1
}
return 생략, 매개변수 생략 및 단축인자 사용
클로저에 return 값이 있으면 마지막 줄을 리턴하므로 return 생략 가능
result = math(x: 10, y: 20, cal: {
$0 + $1
})
trailing closure, return 생략, 매개변수 생략 및 단축인자 사용
result = math(x: 10, y: 20) { $0 + $1 }
댓글