[Swift] Map, Filter, Reduce

Zoe·2022년 1월 22일
0

Swift

목록 보기
11/21
post-thumbnail

Map, Filter, Reduce


✅ 추론(Inference)

  • 공식 문서에도 나와있지만 Swift에서 추론은 아주 강력하며, 코드의 양을 줄여줌. 대신, 추론을 이해하지 못하면 코드의 가독성이 떨어짐

🌟 Swift의 표준 배열 라이브러리는 map, filter, reduce라는 세 가지 기능을 제공

✅ Map

func map<U>(transform: (T) -> U) -> Array<U>

[x1, x2, ... xn].map(f) -> [f(x1), f(x2), ... , f(xn)]
  • 각 항목들을 반영한 결과물을 가진 새로운 배열 반환
//[1, 2, 3, 4]인 배열에서 2씩 곱한 배열을 얻는 예제
let array = [1, 2, 3, 4]
let multipliedArray = array.map( { (value: Int) -> Int in return value * 2 } )
// [2, 4, 6, 8]
//value의 타입 Int와 return 키워드는 추론을 통해 생략 가능
array.map( { (value) -> Int in value * 2 } )
//-> Int도 생략 가능
array.map( {value in value * 2 } )
//value는 여러번 사용하므로 $0으로 축약
array.map( {$0 * 2} )
//괄호도 생략 가능
array.map { $0 * 2 }
//만약 값에 문자열 “Number : “를 붙인다면 다음과 같이 사용
array.map{ "Number :  \($0 * 2)" }

✅ Filter

func filter(includeElement: (T) -> Bool) -> Array<T>
  • 각 항목들을 비교하여 일치하는 결과물을 가진 새로운 배열을 반환
  • includeElement를 지원하는 클로저는 항목이 포함되는지(true) 또는 제외되는지(false) 나타내기 위해 Boolean 값을 반환해야 함
//array의 짝수 값 항목만 가지는 배열을 얻는 예제
let array = [1, 2, 3, 4]
let evenArray = array.filter( { (value: Int) -> Bool in return (value % 2 == 0) } )
//[2, 4]
//앞에서 했던 생략 방식으로 아래와 같이 축약 가능
array.filter { $0 % 2 == 0 }

✅ Reduce

func reduce<U>(initial: U, combine: (U, T) -> U) -> U
  • 배열의 각 항목들을 재귀적으로 클로저를 적용시켜 하나의 값을 만듦
//sum 구현해보기
array.reduce(0, { (s1: Int, s2: Int) -> Int in
    return s1 + s2
})
//클로저는 함수의 마지막에 위치하면 다른 인자와 분리하여 작성할 수 있음
array.reduce(0) { (s1: Int, s2: Int) -> Int in
    return s1 + s2
}
//s1, s2의 타입은 추론하므로 생략 가능
array.reduce(0) { (s1, s2) in s1 + s2 }
//s1과 s2는 $0, $1로 대신하여 사용
array.reduce(0) { $0 + $1 }
//연산자는 중위 연산자로 왼쪽 값이 $0, 오른쪽 값이 $1임을 추론 가능하므로 다음과 같이 생략 가능
array.reduce(0, +)
  • 만일 initial 값이 0이라면 초기 항목은 {0 + 1}.

  • 값이 1이라면 {1 + 1}

  • 클로저이전 결과다음 항목을 계속 호출하여 다음과 같은 과정을 거쳐 하나의 값을 얻음

  • {0 + 1}, {1 + 2}, {3 + 3}, {6 + 4}이며, 결과는 10

profile
iOS 개발자😺

0개의 댓글