클로저란?
- "코드블럭" 이라는 뜻을 가지고 있다.
- 클로저는 일급 객체로 변수, 상수 등으로 저장, 전달인자로 저장이 가능한 형태다.
- 모든 일급 객체는 함수의 실질적인 매개변수가 될 수 있다.
- 모든 일급 객체는 함수의 반환값이 될 수 있다.
- 모든 일급 객체는 할당의 대상이 될 수 있다.
- 모든 일급 객체는 비교연산(==, equal)을 적용할 수 있다.
- 우리가 여태 사용했던 함수들은 모드 "이름 있는 클로저" 형태
클로저 사용 형태
{ (매개변수 목록) -> 반환타입 in 실행 코드 }
함수(이름있는 클로저) 사용
func addFunction(a : Int, b : Int) -> Int { return a + b } var sumReault : Int = addFunction(a: 1,b: 2)
일반 클로저 사용
let add: (Int, Int) -> Int = { (a: Int, b: Int) in return a + b } let sumResult: Int = add(1,2)
- (Int, Int) → Int 에서 Int형 두개를 받아서 Int 하나를 반환하는 형이야!(클로저식 타입 표현)
- { (a: Int, b: Int) in return a + b } 에서 Int형 변수를 2개 받고, Int형을 반환하는 클로저다. 라는 것을 명시
- "따로 상수/ 변수에 클로저를 저장하지 않고 이렇게 매개변수 자리에다가 클로저를 작성할 수 있다."
클로저를 다채롭게 표현할 수 있는 방법은 크게 4가지가 있다.
1. 후행 클로저
//원래의 클로저 방식 : method에 left,right 를 받아서 더한 값을 반환하는 클로저에 넣은 모습
result = calculate(a:10, b: 10, method: { (left : Int, right : Int) -> Int in
return left + right
})
//후행 클로저 방식 : 마지막 method 전달 인자 이름을 생략해서 사용
return = calculate(a: 10, b: 10 { (left: Int, right: Int) -> Int in
return left + right
}
- 클로저가 함수의 마지막 전달인자라면, 마지막 매개변수 이름을 생략해서 함수 소괄호 외부에 클로저를 구현 할 수 있다.
- 우리가 사용하던 dismiss 메소드의 경우를 보면 completion의 전달인자를 클로저로 사용함
- (() → Void)?부분을 더블클릭하면 후행클로저를 작성할 수 있도록 편하게 코드 형태를 바꿔준다.
2. 반환타입 생략
//원래 클로저 작성
result = calculate(a:10, b: 10, method: { (left : Int, right : Int) -> Int in
return left + right
})
result = calculate(a: 10, b: 10) { (left: Int, right: Int) -> Int in
return left + right
}
//반환타입 생략
result = calculate(a:10, b: 10, method: { (left : Int, right : Int) in
return left + right
})
result = calculate(a: 10, b: 10) { (left: Int, right: Int) in
return left + right
}
- 컴파일 상에서 어떤 타입을 반환할지 알고 있다묜 클로저에서는 반환타입을 명시해 주지 않아도 된다.
3. 단축 인자 이름
//원래 클로저 작성
result = calculate(a:10, b: 10, method: { (left : Int, right : Int) -> Int in
return left + right
})
result = calculate(a: 10, b: 10) { (left: Int, right: Int) -> Int in
return left + right
}
//단축 인자이름
result = calculate(a: 10, b: 10, method: {
return $0 + $1
})
result = calculate(a:10, b:10) {
return $0 + $1
}
- 클로저 상에서 매개변수 이름이 불필요하다면, 단축 인자 이름을 활용할 수 있다.
- 단축 인자 이름은 매개변수 순서대로 $0 $1 $2 ... 로 표현한다
4. 암시적 반환 표현
// 기존의 방식
result = calculate(a: 10, b: 10) {
return $0 + $1
}
// 암시적 반환 표현 사용
result = calculate(a: 10,b: 10) {
$0 + $1
}
- 클로저가 반환하는 값이 있자면 마지막 줄의 결과값은 return을 적지 않아도 암시적으로 반환값으로 취급한다.
마지막으로
result = calculate(a:10, b: 10, method: { (left : Int, right : Int) -> Int in
return left + right
})
result = calculate(a: 10, b:10) {$0 + $1}
- 위의 코드는 같은 결과값을 내는 클로버의 표현법이다.
- 하지만 너무 축약을 하면 협업할 때 이해하기에 어려움이 있으니 어떤것을 사용할 건지 잘 합의를 봐야한다.
'iOS > Swift' 카테고리의 다른 글
[iOS] 다른 스토리보드로 화면전환하는 법(code, storyboard reference) (0) | 2021.11.15 |
---|---|
[iOS] WirdCard Pattern, 와일드카드 패턴 (1) | 2021.11.14 |
[iOS] Protocol과 Delegate (0) | 2021.10.31 |
[iOS] Struct와 Class (0) | 2021.10.23 |
[iOS] @IBOutlet과 @IBAction (0) | 2021.10.16 |
댓글