1. 클로저란?
특정 기능을 담은 코드를 블럭으로 모아둔 것
(Swift는 함수를 일급변수로 취급하므로 클로저 역시 매개변수로 활용이 가능)
1. 클로저의 3가지 모양
- 이름을 가지면서 어떤 값도 획득하지 않은 전역 함수의 형태
- 이름을 가진면서 다른 함수 내부의 값을 획득할 수 있는 중첩된 함수의 형태
- 이름이 없고 주변 문맥에 따라 값을 획득할 수 있는 축약 문법으로 작성된 형태
2. 기본 클로저
- 클로저를 사용하지 않는 경우 sorted 매서드 사용
let names = ["scott", "azsha", "john"]
func backwards(first: String, second: String) -> Bool {
return first > second
}
let reversed: [String] = names.sorted(by:backwards)
- 클로저의 기본 형태
{ (매개변수들) -> 반환 타입 in
실행 코드
}
let names = ["scott", "azsha", "john"]
let reversed:[String] = names.sorted(by:{(first: String, second: String) -> Bool in
return first > second
})
3. 후행클로저
마지막 매개변수로 오는 클로저는 () 닫은 후에 와도 상관 없음
let names = ["scott", "azsha", "john"]
let reversed:[String] = names.sorted(){(first: String, second: String) -> Bool in
return first > second
}
또한 ()가 없어도 됨
let names = ["scott", "azsha", "john"]
let reversed:[String] = names.sorted{(first: String, second: String) -> Bool in
return first > second
}
4. 표현 간소화
- 문맥을 통한 유추
let names = ["scott", "azsha", "john"]
let reversed:[String] = names.sorted(){(first, second) in
return first > second
}
- 단축 인자 이름
let names = ["scott", "azsha", "john"]
let reversed:[String] = names.sorted(){
return $0 > $1
}
- 암시적 반환 표현
let names = ["scott", "azsha", "john"]
let reversed:[String] = names.sorted(){ $0 > $1 }
5. 연산자 함수를 클로저의 역할로 활용
let names = ["scott", "azsha", "john"]
let reversed:[String] = names.sorted(by: >)
6. 클로저의 값 획득
함수 안에 있는 값을 클로저가 획득하는 경우 클로저 외부 함수가 종료 한다 하더라도 클로저 안의 값은 사라지지 않는다.
이로인해 생기는 강한참조 순환 문제가 발생하는데, 이것은 차후에 다루기로 한다.
7. 클로저는 reference 타입
클로저는 reference 타입이므로 복사 할 경우, 같은 클로저를 가르키게 된다.
8. 탈출 클로저 (@escaping)
- 클로저가 함수의 매개변수로 들어가 다시 리턴(호출) 되는 경우 필요
- 클로저가 함수의 매개변수로 들어가 외부에 있는 변수에 저장되는 경우 필요
9. 자동 클로저 (@autoclosure)
- 클로저를 만들어두면 자신을 호출하기 전에는 실행하지 않고 가지고만 있음 -> 연산 지연을 통한 코드 실행 제어 수월
- 자동 클로저를 이용하면 클로저의 형식에서 { } 를 제외하고 사용할 수 있음
- 그러나 이해하는데 어려움이 있어 조직원과 규칙을 정하고 사용함을 권장함
'Programer > iOS' 카테고리의 다른 글
[Tip] iOS 기기 고유 식별 값을 사용하고 싶을 때 (UUID, App Groups) (0) | 2017.11.06 |
---|---|
[Swift] Label안에 Image넣기 (0) | 2017.09.05 |
[Swift] 이니시스 결재 모듈 관련 이슈 (아엠포트 소개, EUC-KR 인코딩 변경) (4) | 2016.12.01 |
[Swift] iOS앱 개발 전 반드시 알아야할 3가지 라이브러리 (0) | 2016.11.11 |
[Auyolayout] 오토레이아웃 유용한 팁 모음 (0) | 2016.10.24 |