티스토리 뷰
클로저
{ (parameters) -> return type in
statements
}
{ (매개변수 목록) -> 반환타입 in
실행 코드
}
클로저는 일급 시민으로 변수, 상수 등으로 저장, 전달 인자로 저장이 가능한 형태 !
* 일급 객체의 특징
1. 모든 일급 객체는 함수의 실질적인 매개 변수가 될 수 있다.
2. 모든 일급 객체는 함수의 반환값이 될 수 있다.
3. 모든 일급 객체는 할당의 대사이 될 수 있다.
4. 모든 일급 객체는 비교 연산 (==, equal)을 적용할 수 있다.
우리가 사용했던 함수들은 모두 "이름 있는 클로저" 형태라고 생각하면 된다.
함수로 작성했던 것들 모두 (이름없는 함수인) 클로저로 표현이 가능
// 함수 (이름있는 클로저) 사용
func sumFunction(a: Int, b: Int) -> Int {
return a + b
}
var sumResult: Int = sumFunction(a: 1, b: 2)
// 일반 클로저 사용
let sum: (Int, Int) -> Int { (a: Int, b: Int) in
return a + b
}
let sumResult: Int = sum(1, 2)
후행 클로저
클로저가 함수의 마지막 전달인자라면
마지막 매개변수 이름을 정해서
함수 소괄호 외부에 클로저를 구현할 수 있다 !
func calculate(a: Int, b: Int, methodL (Int, Int) -> Int) -> Int {
return method(a, b)
}
// a,b 라는 Int변수를 받고,
// (Int, Int) -> Int (Int 2개를 받아서 Int 1개 반환하는 클로저)
// 형태의 클로저를 매개변수로 받는 함수
var result: Int
result = calculate(a: 10, b: 10, method: { (left : Int, right : Int) -> Int in
return left + right
})
// method에 left, right 를 받아서 더한 값을 반환하는 클로저를 넣은 모습
result = calculate(a: 10, b: 10) { (left: Int, right: Int) -> Int in
return left + right
}
print(result) // 20
자료 보다가 깜짝 놀랐던 것이 ,,

dissmiss 메서드 completion 의 전달인자가 클로저였다는 사실,,

반환타입 생략
컴파일러 상에서 어떤 타입을 반환할 지 알고 싶다면
클로저에서는 반환타입을 명시해 주지 않아도 알아 듣는다.
result = calculate(a: 10, b: 10, method: { (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) -> Int in
return left + right
}
-> result = calculate(a: 10, b:10) { (left: Int, right: Int) in
return left + right
}
in 키워드 생략 불가 !
단축 인자 이름
클로저 상에서 매개변수 이름이 불필요하다면,
단축 인자이름을 활용할 수 있다.
단축 인자이름은 매개변수 순서대로 $0,$1,$2,$3 ... 로 표현 !
암시적 반환 표현
클로저가 반환하는 값이 있다면
마지막 줄의 결과값은 return 을 적지 않아도
암시적으로 반환값으로 취급 !
'Swift 문법 정리 - iOS' 카테고리의 다른 글
[Swift] 랜덤함수 (0) | 2021.09.26 |
---|---|
[Swift] assert? guard? (0) | 2021.08.24 |
[Swift] 클래스 VS 구조체 / 열거형 (0) | 2021.08.02 |
[Swift] 인스턴스 / 프로퍼티 / 메서드 (1) | 2021.08.02 |
[Swift] 열거형 (enum) (0) | 2021.08.01 |
댓글