상세 컨텐츠

본문 제목

Swift언어6 - 함수형 프로그래밍_클로저

Swift언어

by 앱등개발자IOS 2022. 10. 1. 20:39

본문

1. Swift의 클로저 ( 클로저는 참조 타입이다 )

 

다른 언어의 블록 ( {...} ) 혹은 Lambda와 유사하다!

클로저는 "일정 기능을 하는 코드를 하나의 블록으로 모아놓은 것"  

( 함수는 클로저의 한 형태 )

##클로저는 상수/변수가 선언된 위치에서 Reference를 획득하고 저장할 수 있다.

 

# Swift 클로저 형식!

-   기본적 클로저 형식은 아래와 같다

- { (매개변수들) -> 반환 타입 in

            실행코드 

   }

# Swift 클로저 3가지 형태!

- 이름이 있으면서 어떤 값도 획득하지 않는 전역함수 형태!

- 이름이 있고, 다른 함수 내부 값을 획득할 수 있는 중첩된 함수 형태

- 이름이 없고 주변 문맥에 따라 값을 획득할 수 있는 축약문법으로 작성한 형태

# Swift 클로저 표현방법 2가지! { } 

클로저의 위치를 기준으로 나눌 수 있다.

- 1. 기본 클로저 표현

- 2. 후행 클로저 표현

 

1. 기본 클로저

 -> sorted(by:) 메서드는, 배열의 타입과 같은 두 개의 매개변수를 가지며 Bool 타입을 반환하는 클로저를 전달인자로 받을 수 있다.

 

함수(클로저의 한 형태!!) 혹은 클로저를 사용하여 오름차순으로 정렬해보았다.

## 1. 미리 구현한 함수를 매개변수로 전달하였고,

## 2. 클로저를 매개변수로 전달하였다.

    => in 키워드는 매개변수&반환 타입실행 코드구분하기 위해 사용된다!

## 클로저도 _ a: String과 같이 입출력 매개변수 사용 가능

## 가변 매개변수 사용 가능 ( 매개변수 이름 지정해야함)

## But 매개변수 기본값을 사용할 수 없음

 

==> 미리 구현된 함수를 사용할 때보다 코드가 간결해지고, 함수가 어디있는지 찾아다니지 않아도 됨! 

 

2. 후행 클로저

후행클로저란???

        함수 매개변수로, () 안쪽에 전달하는 것이 아니라, 함수 메서드를 닫고, 그 뒤에 arr.sorted(){ ~~` }와 같이 클로저를 전달해주는 것          이 후행 클로저이다.  

        -> 여러개 클로저를 전달할 때는, 마지막 클로저 하나만 후행 클로저로 전달 가능

        -> 단 하나의 클로저만 전달인자로 전달하는 경우에는 함수의 소괄호() 생략 가능! ( 아래 이미지처럼 )

 - 클로저가 길어지거나, 가독성이 떨어진다 싶으면 후행클로저를 사용!

## 클로저는 메서드에서 요구하는 형태로 전달해야하므로, 매개변수의 타입, 개수, 반환타입 등 유추 가능!! 

      따라서 매개변수/반환값 타입  굳이 표현하지 않고 생략해도 된다!!

 

# 더 간결한 Swift 클로저 표현

1. 단축 인자 이름

- (a, b) -> Bool in 에서 a, b와 같은 매개변수 이름은 의미없기에, 

위처럼 $0, $1, $2, ... 순서로 단축 인자 표현을 사용할 수 있고, 이렇게 되면 in 키워드도 사용할 필요가 없게 된다!!

2. 암시적 반환 표현  (return 생략)

- 클로저의 실행문이 단 한 줄이라면, 암시적으로 해당 실행문을 반환값으로 사용할 수 있다!

 

# Swift 클로저 값 획득 ! 

## 클로저는 자신이 정의된 위치 주변 상수나 변수를 "획득(Capture)"할 수 있다!

-> 더 이상 존재하지 않게된 상수나 변수를 "획득" 해놓았다면, 지속적으로 내부에서 참조하거나 수정하며 사용할 수 있다

 

==> 이것이 비동기 Call-back에 많이 사용됨!!  ( 현재 상태를 미리 획득해두고, 실제로 클로저 기능을 실행할 때 해당 변수/상수가 메모리에 존재하지 않아도 괜찮음 )

 

# 예시

=> makeIncrementer()함수가 끝나도, amount와 total 매개/지역변수들은 사라지지 않고, incrementer가 호출될 때마다 계속 사용할 수 있다.

=> 각각이 자신만의 total변수를 갖고 카운트하게 된다. 

=> 다른 함수의 영향도 전혀 받지 않는다! ( 각자 자신만의 total의 참조미리 획득했기 때문 )

 

# Swift 탈출 클로저 ! 

## 클로저

 

 

 

관련글 더보기