boraBong

[Swift] Swift 고차함수 문법 - Map, Filter, Reduce 본문

iOS/Swift

[Swift] Swift 고차함수 문법 - Map, Filter, Reduce

보라봉_ 2023. 1. 8. 16:14
728x90

✅ map

  • 클로저로 각 항목들을 반영한 결과물을 가진 새로운 배열을 반환합니다.
// Declaration
func map<U>(transform: (T) -> U) -> Array<U>

[x1, x2, ... xn].map(f) -> [f(x1), f(x2), ... , f(xn)]

// transform을 지원하는 클로저는 변경된 값을 반환하기 위해 해당 타입의 값을 반환해야 합니다.
// 다음은 [1, 2, 3, 4]인 배열에서 2씩 곱한 배열을 얻는 예제입니다.

let array = [0, 1, 2, 3]
let multipliedArray = array.map( { (value: Int) -> Int in return value * 2 } )
// [2, 4, 6, 8]


// map에서도 추론하여 코드를 생략할 수 있습니다. 우선, 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)" }
// ✅ 사용 예제
// Character형으로 변환된 result를 Map을 사용하여 String형 배열로 변환!
result.sorted(by: >).map({ String($0 )})

 

✅ Filter

  • 주어진 술어를 만족하는 시퀀스의 요소를 순서대로 포함하는 배열을 반환합니다.
  • 클로저로 각 항목들을 비교하여 일치하는 결과물을 가진 새로운 배열을 반환합니다.
func filter(_ isIncluded: (Self.Element) throws -> Bool) rethrows -> [Self.Element]
// * isIncluded를 allow(만족)하는 요소들의 집합을 return한다.
// ✅ 사용 예제

// win_nums: [Int], lottos: [Int]
// win_nums 중에서 lottos에 포함된 것들만 필터링하여 배열을 반환
win_nums.filter({ lottos.contains($0) })

 

 

✅ Reduce

  • 주어진 클로저를 사용하여 시퀀스의 요소를 결합한 결과를 반환합니다.
  • 배열의 각 항목들을 재귀적으로 클로저를 적용시켜 하나의 값을 만듭니다.
    • 연산자는 중위 연산자로 왼쪽 값이 $0, 오른쪽 값이 $1임을 추론 가능하므로 다음과 같이 생략 가능합니다.
    • array.reduce( 0, + )
  • 시간복잡도: O(n), where n is the length of the sequence.
// Declaration
func reduce<U>(initial: U, combine: (U, T) -> U) -> U

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 }
// ✅ 사용 예제
let numbers: [Int] = [1, 2, 3, 4, 5]
return (0...9).filter { !numbers.contains($0) }.reduce(0) { $0 + $1 } // 결과: 30

// 생략
return (0...9).filter { !numbers.contains($0) }.reduce(0, +)

 

 

 

 

출처

https://developer.apple.com/documentation/swift/array/map(_:)-87c4d 

 

Apple Developer Documentation

 

developer.apple.com

https://minsone.github.io/mac/ios/swift-map-filter-reduce-and-inference

 

[Swift]Map, Filter, Reduce 그리고 추론

우선 Swift의 Map, Filter, Reduce에 설명하기 앞서 Closure에서 사용될 추론에 대해 먼저 설명하고자 합니다. 추론(Inference) 애플 문서에도 나와있지만 Swift에서 추론은 아주 강력하며, 코드의 양을 줄여

minsone.github.io

https://developer.apple.com/documentation/swift/array/reduce(_:_:) 

 

Apple Developer Documentation

 

developer.apple.com

https://developer.apple.com/documentation/swift/sequence/filter(_:) 

 

Apple Developer Documentation

 

developer.apple.com

 

반응형

'iOS > Swift' 카테고리의 다른 글

[Swift] Regex, 정규표현식 사용하기  (0) 2023.02.22
[Swift] 구조체와 클래스  (1) 2022.04.15
[Swift] 함수형 프로그래밍이란?  (0) 2020.12.08
Comments