본문 바로가기
🍎 Swift/iOS 문법 노트

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

by 솔비님 2024. 7. 24.

Map

내부의 데이터를 가공하여 새로운 콜렉션을 생성하는 것
지금까지의 경험으로는 주로 배열에 사용되는 것 같다

 

 

배열의 모든 요소에 1을 더하는 map 함수 예제

let numbers = [1, 2, 3, 4, 5]
let numbersPlusOne = numbers.map({ $0 + 1 })

print(numbersPlusOne) // [2, 3, 4, 5, 6]

 

문자열 배열 내 요소의 길이를 구하는 map 함수 예제

let words = ["apple", "banana", "cherry"]
let wordLengths = words.map { $0.count }

print(wordLengths) // [5, 6, 6]

 

딕셔너리의 값을 변환하는 map 함수 예제

let scores = ["A": 50, "B": 75, "C": 100]
let doubleScores = scores.mapValues { $0 * 2 }

print(doubleScores) // ["A": 100, "B": 150, "C": 200]

 

문자열 배열을 정수 배열로 변환하는 map 함수 예제

let stringNumbers = ["1", "2", "3", "4", "5"]
let intNumbers = stringNumbers.map { Int($0)! }

print(intNumbers) // [1, 2, 3, 4, 5]

 


Filter

내부 데이터에서 각 요소에 주어진 조건을 적용하여
조건에 만족하는 요소들만 포함하는 새로운 배열을 반환한다

 

 

짝수만 필터링하는 filter 함수 예제

let numbers = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
let evenNumbers = numbers.filter { $0 % 2 == 0 }

print(evenNumbers) // [2, 4, 6, 8, 10]

 

문자열 배열에서 길이 조건을 만족하는 요소를 필터링

let words = ["aa", "bbb", "cccc", "ddddd", "eeeeee"]
let longWords = words.filter { $0.count >= 5 }

print(longWords) // ["ddddd", "eeeeee"]

 

딕셔너리의 특정 값을 필터링

let scores = ["A": 50, "B": 75, "C": 90, "D": 65]
let passingScores = scores.filter { $0.value >= 70 }

print(passingScores) // ["B": 75, "C": 90]

 

객체 배열에서 특정 속성을 필터링

class Person {
    var name: String
    var age: Int

    init(name: String, age: Int) {
        self.name = name
        self.age = age
    }
}

let people = [
    Person(name: "A", age: 30),
    Person(name: "B", age: 20),
    Person(name: "C", age: 25)
]

let adults = people.filter { $0.age >= 21 }

adults.forEach { print($0.name) }
// A
// C

 


Reduce

배열의 모든 요소를 차례차례 합쳐서 하나의 값으로 만든다

 

모든 요소를 덧셈

let numbers = [1, 2, 3, 4, 5]
let sum = numbers.reduce(0, { $0 + $1 })
print(sum) // 출력: 15

 

모든 요소를 곱셈

let numbers = [1, 2, 3, 4, 5]
let product = numbers.reduce(1, { $0 * $1 })
print(product) // 출력: 120

 

문자열 연결

let words = ["Hello", "World", "Swift"]
let sentence = words.reduce("", { $0 + " " + $1 })
print(sentence) // 출력: "Hello World Swift"

 

딕셔너리 키값 합산

let items = [
    ["name": "A", "price": 3],
    ["name": "B", "price": 2],
    ["name": "C", "price": 5]
]

let totalPrice = items.reduce(0, { $0 + ($1["price"] ?? 0) })
print(totalPrice) // 출력: 10

 

조건에 맞는 값의 합산

let numbers = [1, 2, 3, 4, 5, 6]
let evenSum = numbers.reduce(0, { $0 + ($1 % 2 == 0 ? $1 : 0) })
print(evenSum) // 출력: 12