728x90
반응형
클로저란?
- 코드에서 전달 및 사용할 수 있는 독립 기능 블록이며, 일급 객체의 역할을 할 수 있다.
- 참조 타입
- 이름 없는 함수, 익명 함수로 지칭한다.
- 즉, 클로저는 Named Closure, Unnamed Closure 모두 포함하지만, 보통 Unnamed Closure를 말한다.
- 함수는 클로저의 한 형태로, Named Closure(이름이 있는 클로저)이다.
일급 객체가 궁금하다면 아래 더보기 클릭 !
더보기
일급 객체: 전달 인자로 보낼 수 있고, 변수/상수 등으로 저장하거나 전달할 수 있으며, 함수의 반환 값이 될 수도 있다.
클로저 문법 (head & body)
{ (매개 변수) -> 리턴 타입 in
실행 구문
}
클로저에서는 전달 인자 레이블을 사용하지 않는다.
클로저 예시
1. 파라미터와 리턴 타입이 없는 클로저
let hello = { () -> () in
print("hello")
}
hello()
2. 파라미터와 리턴 타입이 있는 클로저
let hello2 = { (name: String) -> String in
return "Hello, \(name)"
}
hello2("hammii")
3. 파라미터로 클로저를 사용하는 경우
func doSomething(closure: () -> ()) {
closure()
}
doSomething(closure: {() -> () in
print("hello")
})
doSomething() { // 파라미터와 반환값이 없는 클로저는 이렇게 생략 가능
print("hello2")
}
doSomething { // 단 하나의 클로저만 매개변수로 전달하는 경우 소괄호 생략 가능
print("hello2")
}
4. 반환 타입으로 클로저를 사용하는 경우
func doSomething2() -> () -> () {
return { () -> () in
print("hello4")
}
}
doSomething2()()
후행 클로저
클로저가 조금 길어지거나 가독성이 떨어지면 후행 클로저 기능을 사용하면 된다.
후행 클로저란?
- 클로저가 함수의 마지막 argument라면 마지막 매개변수 이름을 생략한 후 함수 소괄호 외부에 클로저를 구현할 수 있게 해주는 것
//후행 클로저 미사용
let onAction = UIAlertAction(title: "On", style: UIAlertAction.Style.default, handler: {
// 실행 코드
})
//후행 클로저 사용
let onAction = UIAlertAction(title: "On", style: UIAlertAction.Style.default) {
// 실행 코드
})
매개변수에 클로저가 여러 개인 경우, 아래와 같이 다중 후행 클로저 문법을 사용할 수 있다.
func doSomething2(success: () -> (), fail: () -> ()) {
}
doSomething2 {
<#code#>
} fail: {
<#code#>
}
클로저 표현을 간소화하는 방법
func doSomething3(closure: (Int, Int, Int) -> Int) {
closure(1,2,3)
}
doSomething3(closure: { (a, b, c) in
return a+b+c
})
doSomething3(closure: {
return $0+$1+$2 // 약식 인수 - 매개변수 이름을 대신하여 사용할 수 있음
})
doSomething3(closure: {
$0+$1+$2 // 단일 리턴문일 경우, return 생략 가능
})
doSomething3() {
$0+$1+$2
}
doSomething3 {
$0+$1+$2
}
출처: [패스트캠퍼스] 30개 프로젝트로 배우는 iOS 앱 개발 with Swift 초격차 패키지 Online.
728x90
반응형