Swift

[Swift] 고차함수

문군_ 2024. 12. 13. 20:42

고차함수

고차함수란?

고차함수는 다른 함수를 전달인자로 받거나 함수실행의 결과를 함수로 반환하는 함수를 뜻합니다.

고차함수의 종류

  • map

  • filter

  • reduce

  • forEach

  • compactMap

  • FlatMap

    map

    기존의 컨테이너 요서에 대해 정의한 클로저로 매핑한 결과를 새로운 컨테이너로 반환합니다.

먼저 enumerated() 메소드를 설명하자면 파이썬의 enumerate 처럼 배열의 원소와 index(offset)을 튜플로 바꿔주는 함수입니다.

let test = ["hi","hello", "nice"]
print(test.enumerated().map({ $0 }))
// 출력: [(offset: 0, element: "hi"), (offset: 1, element: "hello"), (offset: 2, element: "nice")]

바로 위 예시도 튜플들을 고차함수 map을 사용하는데, 클로저에 $0 만 넣어줌으로써 아무것도 안하고 각각 튜플들을 원소로 하는 배열이 생성되었음을 알 수 있었습니다!

func addDivier(_ input: [String]) -> String {
    return input.enumerated().map { (index, element) in
        index == 4 ? element + "|" : element
    }.joined(separator: "|") + "|"
}

이제 제 코드를 보시면 map으로 새로운 컨테이너(배열) 을 만드는데, 조건으로 index == 4 인 경우 element + "|"를 원소로 만들어 배열에 넣어주는 것을 알 수 있습니다.

filter

기존 컨테이너 요소에 대해 조건에 만족하는 값에 대해서 새로운 컨테이너로 반환합니다.

map과 비슷해보이나, filter는 클로저 내부의 결과값이 true가 되는 원소만을 다시 컨테이너로 만들어줍니다.

// numbers에서 짝수만 추출하기let numbers = [1, 2, 3, 4, 5, 6, 7, 8, 9]
var evenNumbers: [Int] = []
for number in numbers {
    if number % 2 == 0 {
        evenNumbers.append(number)
    }
}

let filteredNumbers = numbers.filter { $0 % 2 == 0 }

위 반복문과 아래의 filter는 동일하게 동작하는 코드입니다.

reduce

정의한 클로저를 사용하여 기존 컨테이너의 요소를 결합한 결과를 반환합니다.

reduce는 클로저 내부에 컨테이너의 요소를 어떤 방식으로 누적시킬 지 작성하여 이를 토대로 결과값을 반환하여 줍니다.

// 각 요소의 합 구하기let numbers = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
var sum = 0

for number in numbers {
    sum += number
}
let sum = numbers.reduce(0) { $0 + $1 }
// 55

reduce함수 소괄호는 초기값을 넣어줄 수 있습니다. 만약 0 대신 10을 넣어주었다면 sum은 65를 반환할 것입니다. $0 + $1 은 현재까지의 결합 결과와 그 다음 원소를 더해준다는 소리입니다.