책 내용을 한 번에 이해하기가 어려워서 클로저 기본 내용은 야곰 유튜브 강의를 참고했다.
클로저 기본
- 클로저는 일정 기능을 하는 코드를 하나의 블록으로 모아놓은 것
- 스위프트의 클로저는 C언어나 Objective-C의 블록(Block) 또는 다른 프로그래밍 언어의 람다(Lamda)와 유사
- 클로저는 변수나 상수가 선언된 위치에서 참조(reference)를 획득(capture)하고 저장할 수 있음. 이를 변수나 상수의 클로징(잠금)이라고 하며 클로저는 여기서 착안된 이름
클로저의 형태와 기본 사용 예시
{(매개변수 목록) -> 반환 타입 in 실행 코드 }
// 함수를 사용한다면 func sumFunction(a: Int, b: Int) -> Int { return a + b } var sumResult: Int = sumFunction(a: 1, b: 1) print(sumResult) // 클로저를 사용한다면 var add: (Int, Int) -> Int = { (a: Int, b: Int) -> Int in return a + b } sumResult = add(2, 2) print(sumResult)
// (Int, Int) -> Int 를 매개변수로 받는 함수 calculate에 클로저 add, subtract를 전달하여 함수 실행 func calculate (a: Int, b: Int, method: (Int, Int) -> Int) -> Int { return method(a, b) } var add: (Int, Int) -> Int = { (a: Int, b: Int) -> Int in return a + b } var subtract: (Int, Int) -> Int = { (a: Int, b: Int) -> Int in return a - b } var calculated: Int calculated = calculate(a: 3, b: 3, method: add) print("add: \(calculated)") // add: 6 calculated = calculate(a: 3, b:3, method: subtract) print("subtract: \(calculated)") // subtract: 0
클로저 고급
– 후행 클로저, 반환타입 생략, 단축인자 이름, 암시적 반환 표현
후행 클로저(Trailing Closures)
// 후행 클로저 // 클로저가 함수의 마지막 전달인자라면 // 마지막 매개변수 이름을 생략한 후 // 함수 소괄후 외부에 클로저를 구현할 수 있음 result = calculate(a: 10, b: 10) {(left: Int, right: Int) -> Int in return left + right } print(result)
반환 타입 생략(Inferring Type From Context)
// calculate 함수의 method 매개변수는 Int 타입을 반환할 것이라는 것을 컴파일러가 알기 때문에 // 굳이 클로저에서 반환타입을 명시해주지 않아도 됨 // 대신 in 키워드는 생략할 수 없음 result = calculate(a: 20, b: 20, method: {(left: Int, right: Int) in return left + right }) print(result) // 후행클로저와 함께 사용할수도 있음 result = calculate(a: 30, b: 30){(left: Int, right: Int) in return left + right } print(result)
단축 인자 이름(Shorthand Argument Names)
// 단축 인자 이름 // 클로저의 매개변수 이름이 불필요하다면 단축 인자 이름을 활용할 수 있음 // 단축 인자 이름은 클로저의 매개변수 순서대로 $0, $1...처럼 표현함 result = calculate(a: 40, b: 40, method: { return $0 + $1 }) print(result) // 후행클로저와 함께 사용 result = calculate(a: 50, b: 50){ return $0 + $1 } print(result)
암시적 반환 표현(Implicit Returns from Single-Expression Closures)
// 암시적 반환 표현 // 클로저가 반환하는 값이 있다면 // 클로저의 마지막 줄의 결과값은 암시적으로 반환값으로 취급됨 // return을 명시해줄 필요 없음 result = calculate(a: 60, b:60){$0 + $1} print(result)