하루를살자

Swift - Closure (1): 표현식 본문

Swift

Swift - Closure (1): 표현식

Kai1996 2022. 2. 27. 00:45

스위프트에서 클로저는 일회용 함수를 작성할수 있는 구문이며 이름을 작성할 팔요없이 생략된다는 점에서 익명(Anonymous) 함수 라고도 불린다. 익명함수 라는 이름에 걸맞게 함수를 선언하는 func 키워드를 생략하며, 함수의 이름또한 생략 한다.

1. Func 키워드 와 함수명 제외한 클로저 문법

    {(매개변수) -> 반환 타입 in 
        실행구문 
    }
  • in 키워드를 사용하여 실행 블록의 시작을 표현 한다.

2. 반환 타입이 없는 클로저

    {() -> () in 
        실행구문 
    }
    //or
    {() -> Void in 
        실행구문 
    }
  • 클로저 표현식의 모호성을 제거하기 위해 반환 값이 없는 함수는 빈괄호나 타입 에일리어스 로 작성된 Void 를 이용해서 표현가능.

3. 클로저 경량 문법

일급함수 의 특징을 사용해서 매개변수로 다른 함수를 받는 CustomFilter 라는 함수를 작성해보자.

func customFilter(closure : (Int) -> Bool , numbers : [Int]) -> [Int] { 
    var tempArray = [Int]()
    for number in numbers {
      if closure(number) {
          tempArray.append(number) 
      }          
    }
    return tempArray
}
  • CustomFilter 메소드는 첫번째 매개 변수로 Int 를 받고 Bool 을 반환하는 클로저를 가지고 있고, 두번째 매개변수로 [Int] 을 받고 Int 형 배열을 반환해준다.
  • 위 함수의 빠른 이해를 위해서 매개변수로 설정된 closure 를 함수로 작성해보고 customFilter(closure: ,numbers:) 메소드의 인자로 넣어 배열을 필터링을 해보자.
func filterLessThanThree(val : Int) -> Bool { 
    return val > 3
} 

customFilter(closure : filterLesserThanThree , numbers : [1,2,4,5]) 
// [4,5]
  • 작성된 함수 filterLessThanThree 는 매개변수로 들어오는 Int 값이 3 보다 크면 true 를 반환하여 배열에 해당 값을 append 시켜준다.
  • 이제 앞에서 설명했던 클로저 표현 방법을 사용하여 customFilter 에 적용시켜보자.
//filterLessThanThree 을 클로저 표현식으로 바꾸어 작성. 
{(val : Int) -> Bool in 
return val >3}

//`customFilter` 의 인자값으로 바로 사용하기 
customFilter(closure: { (val:Int) -> Bool in
    return val > 3
}, numbers: [1,2,4,5])
  • 이런식으로 함수의 매개변수로 클로저를 사용하면 일회성 함수를 사용하거나 이미 정해져 있는 다른 함수를 사용함으로 써 기능을 분할해서 활용 할 수 있다.
  • 이제 마지막으로 주어진 " customFilter 의 인자값으로 바로 사용하기 " 부분에서 부터 컴파일러 의 추론 으로 인해 어떠한 부분이 생략이 될수 있는지 알아 보자.
//매개변수 타입 생략 
{val -> Bool in return val > 3 }

//매개변수명 대신 할당된 내부상수 ($0,$1,$2....) 이용 & in 키워드 생략
{return $0 > 3} 


  • 매개 변수 타입 생략 : 매개변수의 타입 어노테이션이 생략 되면서 매개변수를 감싸고 있던 괄호도 함께 생략 되었다.
  • 매개변수명 대신 할당된 내부상수 ($0,$1,$2....) 이용 & in 키워드 생략 : 할당된 내부상수는 입력받은 인자값의 순서대로 매칭된다. (첫번째 인자값이 $0 에 할당되고 그 값이 3과 비교된다). 또한 매개변수가 생략되면 남는 것은 실행 구문이므로 in 키워드로 실행구문과 클로저 선언 부분을 분리한 필요가 없어지므로 in 키워드를 생략 가능하다.

'Swift' 카테고리의 다른 글

[Swift] Expansive DateFormatter : 어떻게 사용해야할까?  (0) 2022.06.09
Swift - Closure (2) : Trailing Closure  (0) 2022.02.27
Swift 고차함수  (0) 2022.02.05
Swift - Collection Types  (0) 2022.01.01
Swift - Enum  (0) 2021.12.31
Comments