[스위프트 프로그래밍-15장] 맵, 필터, 리듀스

sanghee·2021년 11월 22일
0
post-thumbnail

이 글은 스위프트 프로그래밍(3판, 야곰 지음)을 읽고 간단하게 정리한 글입니다. 책에 친절한 설명과 관련 예제 코드들이 있으므로 직접 사서 읽기를 추천합니다.

15.0 소개

스위프트는 함수를 일급 객체로 취급한다. 매개변수로 함수를 갖는 함수를 고차함수라고 하는데, 스위프트의 대표적인 고차함수로는 맵, 필터, 리듀스 등이 있다.

일급객체 조건

  1. 전달인자로 전달이 가능하다.
  2. 동적 프로퍼티에 할당이 가능하다.
  3. 변수, 데이터 구조에 담을 수 있다.
  4. 반환값으로 사용이 가능하다.
  5. 고유한 객체로 구별된다.

15.1 맵(map)

맵은 매개변수로 전달된 함수를 실행하여 그 결과를 반환한다. 기존 컨테이너의 값은 변경되지 않고 새로운 컨테이너가 생성되어 반환된다.for-in 구문과 차이는 없지만 코드의 재사용이나 컴파일러 최적화 측면에서 성능 차이가 있다. 또한 다중 스레드 환경에서 기존 컨테이너의 값이 동시에 변경되는 부작용을 방지할 수 있다.

let names = ["kim", "Lee"]

let greetings = names.map { "Hello, \($0)!" }
print(greetings) // ["Hello, kim!", "Hello, Lee!"]

flatMap과 compactMap의 차이

flatMapt과 compactMap은 nil을 제거하지않고 1차원 배열일때만 nil을 제거한다. compactMap과 다르게 flatMap은 2차원 배열을 1차원으로 flat하게 만든다.

let array = [1, nil, 3, nil, 4]

let compactArray = array.compactMap { $0 } // [1, 3, 4]
print(compactArray)

2차원 배열을 nil이 없는 1차원 배열로

let array = [[1, nil, 3], [nil, 4]]

let compactArray = array.flatMap { $0 }.compactMap { $0 } // [1, 3, 4]

print(compactArray)

15.2 필터(filter)

필터는 컨테이너 내부의 값을 전달 함수의 Bool 결과값에 따라 걸러 반환한다.

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

let evenNumbers = numbers.filter { $0 % 2 == 0 }
print(evenNumbers) // [0, 2, 4]

15.3 리듀스(reduce)

리듀스는 두가지 형태로 구현되어 있다. 첫번째 리듀스는 클로저가 각 요소를 전달받아 연산한 후 다음 순환을 위하 반환하며 컨테이너를 순환한다. 모든 순회가 끝나면 최종 결과값을 반환한다.

let numbers = [1, 2, 3]

var sum = numbers.reduce(0) { $0 + $1 }
sum = numbers.reduce(0, +)
print(sum) // 6
profile
👩‍💻

0개의 댓글