Swift 고차함수 정리 - map, flatMap, compactMap / filter, reduce, forEach

728x90

고차함수 (High order function)

다른 함수를 매개변수로 받거나 반환하는 함수를 의미한다.
클로저와는 다르다 (클로저는 이름이 없는 익명함수)

 

고차함수가 매개변수로 받는 함수가 클로저일때가 많아서 헷갈릴수는 있지만, 고차함수 안에서 클로저를 자주 사용하는 것 뿐 같은 개념은 아니다.

특징

  • 가독성
  • 함수형 프로그래밍 스타일
  • 재사용성 높음

map

let numbers = [1, 2, 3, 4, 5]
let twoTimesNumbers = numbers.map{ $0*2 }
//[2, 4, 6, 8, 10]

각 요소에 동일한 연산을 적용해 새로운 배열을 반환한다.
for-in문과 비교했을 때 차이는 없지만, 속도면에서 차이가 있다. (요소가 많을수록 차이 남)

flatMap

let numbers = [[1, nil], [nil, nil, 2], [3]]
let flatArray = numbers.flatMap{ $0 }
//[Optional(1), nil, nil, nil, Optional(2), Optional(3)]

다차원 배열을 1차원 배열로 flat하게 만들어 반환한다.
Optional을 따로 처리하진 않기 때문에 만약 Optional을 없애고 싶다면 CompactMap을 같이 쓰면 된다!

 

사용하다보면 1차원 배열에 flatMap을 써도 옵셔널이 제거되는걸 볼 수 있는데, deprecated 된 것이니까 compactMap을 쓰자.

 

자세한건 compactMap에 설명

compactMap

let numbers = [1, nil, 3, nil, 5]
let numbersWithOutNil = numbers.map{ $0 }
//[1, 3, 5]

요소 중 Optional을 제거한 나머지 요소들을 반환한다.

Nil이 있는 1차원 배열에 FlatMap을 사용해도 compactMap과 동일한 기능을 하는데,
이는 Swift4.1 이전 flatMap이 두 기능(평탄화, 옵셔널제거)을 모두 같이 했었다가
이후에 평탄화만 되는 flatMap, 옵셔널 제거를 위한 compactMap 두 가지로 나눴다.

filter

let numbers = [1, 2, 3, 4, 5]
let temp = numbers.filter{ $0 % 2 == 0 }
//[2, 4]

요소 중 주어진 조건을 만족하는 요소들만 포함하는 새로운 배열을 반환한다.

reduce

let numbers = [1, 2, 3, 4, 5]
let sum = numbers.reduce(0, +)
//15

모든 요소를 하나로 합쳐 단일값을 반환한다.
초기값과 결합하는 방법을 파라미터로 넘기면 된다.

 

결합하는 방법은 간단하게 사칙연산자를 사용해도 되고, numbers.reduce(0) {$0 + $1} 처럼 클로저를 사용하는것도 가능하다.

ForEach

let numbers = [1, 2, 3, 4, 5]

numbers.forEach { number in
    print(number)
}

각 요소에 대해 주어진 작업을 수행한다. 반환값은 없고, 반복문 대용으로 사용하는 편.

 

for-in문과 비슷해보이지만 break, continue와 같은 반복문에 들어가는 키워드를 사용할 수 없다.


728x90