클로저 표현식
스위프트에서의 클로저와 클로저 표현식은 용어가 혼용되고 있지만, 몇 가지 큰 차이가 있다.
클로저 표현식은 독립적인 코드 블록이다.
예를 들어, 다음은 클로저 표현식을 선언하고 그것을 sayHello라는 이름의 상수를 할당한 다음에 상수 참조를 통해 함수를 호출한다.
let sayHello = {print("Hello")}
sayHello()
클로저 표현식은 매개변수를 받아 결과값을 반환하도록 구성할 수도 있다.
{(<매개변수 이름> : <매개변수 타입>, <매개변수 이름>: <매개변수 타입>, ... ) -> <반환 타입> in
// 클로저 표현식 코드
}
예를 들어 클로저 표현식으로 두 개의 정수를 매개변수로 받아 하나의 정수를 결과로 반환하는 코드를 만들어 보면
let multiply = {(_ val1 : Int, _ val2: Int) -> Int in
return val1 * val2
}
let result = multiply(10,20)
이 예는 함수를 선언할 때 사용하는 것과 비슷하지만, 클로저 표현식은 이름을 갖지 않으며, 매개변수와 반환타입은 괄호 안에 포함되고, 클로저 표현식 코드의 시작을 가리키기 위해 in 키워드를 사용한다.
사실, 함수는 이름이 있는 클로저 표현식일 뿐이다.
클로저 표현식은 비동기 메서드 호출에 대한 완료 핸들러를 선언할 때 종종 사용된다.
iOS 앱을 개발할 때 어떤 작업을 백그라운드에서 작업하게 해서 앱이 다른 작업을 계속 할 수 있도록 운영체제에게 요청해야 하는 경우가 종종 생긴다. 이런 경우에 보통 시스템이 앱에게 작업이 완료된 것을 알리고 메서드를 호출할 때 선언했던 완료 핸들러를 호출하여 결과를 반환한다.
예시로
eventstore.requestAccess(to: .reminder, completion: {(granted: Bool,
error: Error?) -> Void in
if !granted {
print(error!.localizedDescription)
}
})
requestAccess(to:) 메서드 호출로 수행된 작업이 완료되면, completion: 매개변수로 선언된 클로저 표현식이 실행된다.
다음의 선언부와 같이 이 완료 핸들러는 Bool 값과 Error 객체를 매개변수로 받으며 아무런 결과도 반환하지 않는다.
{(granted: Bool, error: Error?) -> Void in
스위프트의 클로저
컴퓨터 공학 용어에서의 클로저는 함수나 클로저 표현식과 같은 독립적인 코드 블록과 코드 블록 주변에 있는 하나 이상의 변수가 결합된 것을 말한다.
예를 들어
func functionA() -> () -> Int {
var counter = 0
func functionB() -> Int {
return counter + 10
}
return functionB
}
let myClosure = functionA()
let result = myClosure()
이 코드에서 functionA는 functionB라는 이름의 함수를 반환한다. 사실, functionB는 functionB의 내부 영역 밖에 선언된 counter 변수에 의존하기 때문에 functionA는 클로저를 반환하고 있다.
다시 말해, functionB는 counter 변수를 잡고 있다(captured) 또는 가두고 있다(closed over)라고 말할 수 있으므로 컴퓨터 공학 용어인 클로저로 간주된다.
출처 : 핵심만 골라 배우는 SwiftUI 기반의 iOS 프로그래밍
책을 보면서 내용을 정리했습니다.. 혹시 틀린 내용이 있다면 댓글로 언제나 말씀해주세요!!!☺️
'iOS > Swift 문법' 카테고리의 다른 글
[Swift문법] 객체지향 프로그래밍 기초 (2) (0) | 2022.01.02 |
---|---|
[swift문법] 객체지향 프로그래밍 기초 (0) | 2021.12.30 |
[Swift 문법] 함수, 메서드 (0) | 2021.12.27 |
[Swift 문법] 제어 흐름, 반복문과 조건문 (0) | 2021.12.24 |
[Swift 문법] 연산자와 표현식 (0) | 2021.12.23 |