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

Kiwi·2024년 3월 15일

Swift

목록 보기
13/21
post-thumbnail

📁 고차함수

고차함수는 클로저를 공부할때 살짝 공부한 적이 있다. 고차함수는 다른 함수를 전달인자로 받거나 함수실행의 결과를 함수로 반환하는 함수 를 말한다. 함수에 매개변수는 타입이 정해져 있다. 따라서 함수에 전해줘야 하는 클로저의 타입도 고차함수마다 다 다르게 정해져 있다. 즉, 고차함수마다 전달하는 클로저는 각각 다르고 수행하는 역할도 다 제각각이라는 것이다!!!!🥲

📝 map

스위프트의 표준 라이브러리에서 제공되는 함수이다. 이 함수는 컬렉션(배열, 딕셔너리, 세트)와 string의 각 요소에 대해 주어진 클로저를 적용한 후, 새로운 컬렉션을 반환한다.

func map<T>(_ transform: (Element) throws -> T) rethrows -> [T]
  • transform : 컬렉션의 각 요소에 적용할 클로저이다. 이 클로저는 컬렉션의 요소를 입력으로 받아 새로운 타입으로 변환하여 반환한다.
  • T : 클로저가 반환하는 타입을 나타낸다.
  • rethrows : transform 클로저가 에러를 던질 수 있다는 것을 나타낸다. 만약 map 함수가 에러를 던지지 않는다면 , rethrows 키워드를 사용할 필요가 없다.

즉 map이라는 함수는 매개변수로 시퀀스의 요소를 받아들이고 반환값으로는 시퀀스의 변환된 요소를 포함하는 배열을 반환한다!!! 이때 시퀀스란 배열, 딕셔너리, 세트, 문자열, 범위, 이터레이터 등을 말한다.

📍array일때 (가장 많이 쓰인다)

배열일때 배열의 각 요소가 클로저의 파라미터로 들어간다.

let numbers = [1, 2, 3, 4, 5]
let strings = numbers.map { String($0) }
let string = numbers.map { (num) -> String in
	return "\(number)"
}

📍dictionary일때

dictionary일때 dictionary의 key와 value값이 쌍으로 들어간다. 즉 파라미터가 2개! 그런데 mapValues를 이용해 value만 지정해서 넣을 수도 있다.

let dictionary = ["a": 1, "b": 2, "c": 3]
let stringDictionary = dictionary.map { key, value in
    return "\(key): \(value)"
}
print(stringDictionary) // 출력: ["a: 1", "b: 2", "c: 3"]

📍set일때

set일때 set의 각 요소가 클로저의 파라미터로 들어간다.

let numberSet: Set<Int> = [1, 2, 3, 4, 5]
let stringSet = numberSet.map { String($0) }
print(stringSet) // 출력: ["1", "2", "3", "4", "5"]

📍String일때

string을 이루는 char가 클로저의 파라미터로 들어간다.

let string = "hello"
let uppercaseChars = string.map { $0.uppercased() }
print(uppercaseChars) // 출력: ["H", "E", "L", "L", "O"]

✅ map과 compactMap
map은 옵셔널 타입을 반환할 수 있지만, compactMap은 옵셔널 값이 있는 요소를 제거하고 옵셔널이 해제된 값을 가진 요소만을 반환한다.



📝 filter

스위프트의 표준 라이브러리에서 제공되는 함수이다. filter 함수는 컬렉션의 요소를 걸러서 새로운 컬렉션으로 반환하는 고차함수이다.

func filter(_ isIncluded: (Element) throws -> Bool) rethrows -> [Element]
  • isIncluded : 컬렉션의 각 요소에 대해 실행할 클로저가 매개변수로 들어온다. 클로저는 각 요소를 입력으로 받아 조건을 평가하고, true를 반환하면 해당 요소를 포함시킨다.
  • Element : 컬렉션의 각 요소 타입을 나타낸다

즉 filter라는 함수는 주어진 클로저를 컬렉션의 각 요소에 적용하고, 클로저가 true를 반환하는 요소만을 포함하는 새로운 컬렉션을 생성하여 반환하는 것이다! 이때 컬렉션으로는 배열, 딕셔너리의 값 타입, 세트, 문자열, 범위, 이터레이터 등을 사용할 수 있다.

let numbers = [1, 2, 3, 4, 5, 6, 7, 8, 9]

var evenNumbers = numbers.filter {$0 % 2 == 0}
print(evenNumbers)

var evenNumbers2 = numbers.filter({ num -> (Bool) in
    if num % 2 == 0{
        return true
    } else {
        return false
    }
})
print(evenNumbers2)


📝 reduce

스위프트의 표준 라이브러리에서 제공되는 함수이다. reduce 함수는 컬렉션의 모든 요소를 결합하여 단일 값으로 줄이는 고차 함수이다. 이 함수는 초기값과 클로저를 사용하여 컬렉셔느이 각 요소를 처리하고 결합하여 최종 결과를 생성한다.

func reduce<Result>(_ initialResult: Result, _ nextPartialResult: (Result, Element) throws -> Result) rethrows -> Result
  • initialResult : 초기값으로 사용될 값이다.
  • nextPartialResult : 클로저로 이전 결과와 현재 요소를 입력으로 받아 새로운 부분 결과를 생성한다. 클로저는 각 요소에 대해 반복적으로 호출된다.
  • Result : 클로저가 반환하는 갑스이 타입이자 이 함수의 반환값 타입이다.

즉 reduce라는 함수는 컬렉션의 요소를 반복적으로 결합하여 단일 값으로 반환하는 것이다! 이때 컬렉션으로는 filter 함수와 마찬가지로 배열, 딕셔너리의 값 타입, 세트, 문자열, 범위, 이터레이터 등을 사용할 수 있다.

let numbers3 = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]

let sum1 = numbers3.reduce(0, +)
print(sum1)

let sum2 = numbers3.reduce(0, {$0 + $1} )
print(sum2)


let sum3 = numbers3.reduce(0, { (result, next) in
    return result + next
})
print(sum3)




profile
🐣 iOS Developer

0개의 댓글