iOS/Swift

[Swift] 고차함수 (map, filter, reduce, compactMap, flatMap)

최지철 2024. 7. 5. 10:25
728x90
반응형

고차함수 (Higher-order Function)

Swift에서 고차함수(Higher-Order Function)는 다른 함수를 인자로 받거나 함수를 반환하는 함수입니다.
이러한 함수는 코드의 재사용성을 높이고, 함수형 프로그래밍 스타일을 사용할 수 있게 해줍니다

1. map

map 함수는 배열의 각 요소에 동일한 연산을 적용하여 새로운 배열을 반환합니다.

let numbers = [1, 2, 3, 4, 5]
let squaredNumbers = numbers.map { $0 * $0 }
print(squaredNumbers) // [1, 4, 9, 16, 25]

 

2. filter

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

let numbers = [1, 2, 3, 4, 5]
let evenNumbers = numbers.filter { $0 % 2 == 0 } // if문으로 분기 처리도 가능!
print(evenNumbers) // [2, 4]

 

3. reduce

reduce 함수는 배열의 모든 요소를 하나로 합쳐서 단일 값을 반환합니다. 초기값과 결합하는 방법을 지정해야 합니다.

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

 

4. flatMap

flatMap 함수는 배열의 각 요소를 매핑하여 배열의 배열을 만들고, 이를 단일 배열로 평평하게 만듭니다.

let optionalNumbers: [Int?] = [1, 2, nil, 4, nil, 5]
let nonOptionalNumbers = optionalNumbers.flatMap { $0 }
print(nonOptionalNumbers) // [1, 2, 4, 5]

 

5. compactMap

compactMap 함수는 배열의 각 요소를 매핑하여 옵셔널 값을 반환한 후, nil이 아닌 값을 포함하는 배열을 반환합니다.

let stringNumbers = ["1", "2", "three", "4", "5"]
let validNumbers = stringNumbers.compactMap { Int($0) }
print(validNumbers) // [1, 2, 4, 5]

 

조금 더 와닿는 예시

import Foundation

// JSON 데이터 예시
let jsonData = """
[
    {"name": "Alice", "age": 25},
    {"name": "Bob", "age": 30},
    {"name": "Charlie", "age": null},
    {"name": "David", "age": 22},
    {"name": "Eve", "age": "twenty"}
]
""".data(using: .utf8)!

// 사용자 구조체 정의
struct User: Decodable {
    let name: String
    let age: Int?
}

// JSON 데이터 디코딩
let users = try! JSONDecoder().decode([User].self, from: jsonData)

// 1. `map`: 각 사용자의 이름을 대문자로 변환
let uppercasedNames = users.map { $0.name.uppercased() }
print(uppercasedNames) // ["ALICE", "BOB", "CHARLIE", "DAVID", "EVE"]

// 2. `filter`: 나이가 있는 사용자만 필터링
let usersWithAge = users.filter { $0.age != nil }
print(usersWithAge) // [{"name": "Alice", "age": 25}, {"name": "Bob", "age": 30}, {"name": "David", "age": 22}]

// 3. `compactMap`: 문자열을 정수로 변환하면서 nil 값을 제거
let validAges = users.compactMap { $0.age }
print(validAges) // [25, 30, 22]

// 4. `reduce`: 모든 사용자의 나이의 합 구하기
let totalAge = validAges.reduce(0, +)
print(totalAge) // 77

// 5. `flatMap`: 이 예시에서는 중첩된 배열을 평평하게 만드는 예시로 대체
let nestedNumbers = [[1, 2, 3], [4, 5], [6, 7, 8]]
let flattenedNumbers = nestedNumbers.flatMap { $0 }
print(flattenedNumbers) // [1, 2, 3, 4, 5, 6, 7, 8]

 

고차함수의 장점

  1. 가독성: 고차함수를 사용하면 코드가 간결해지고 가독성이 높아집니다.
  2. 재사용성: 함수형 프로그래밍 스타일로 코드를 작성하면 코드의 재사용성이 증가합니다.
  3. 유연성: 함수로 동작을 추상화함으로써 코드의 유연성을 높일 수 있습니다.
728x90
반응형