고차함수는 클로저를 공부할때 살짝 공부한 적이 있다. 고차함수는 다른 함수를 전달인자로 받거나 함수실행의 결과를 함수로 반환하는 함수 를 말한다. 함수에 매개변수는 타입이 정해져 있다. 따라서 함수에 전해줘야 하는 클로저의 타입도 고차함수마다 다 다르게 정해져 있다. 즉, 고차함수마다 전달하는 클로저는 각각 다르고 수행하는 역할도 다 제각각이라는 것이다!!!!🥲
스위프트의 표준 라이브러리에서 제공되는 함수이다. 이 함수는 컬렉션(배열, 딕셔너리, 세트)와 string의 각 요소에 대해 주어진 클로저를 적용한 후, 새로운 컬렉션을 반환한다.
func map<T>(_ transform: (Element) throws -> T) rethrows -> [T]
즉 map이라는 함수는 매개변수로 시퀀스의 요소를 받아들이고 반환값으로는 시퀀스의 변환된 요소를 포함하는 배열을 반환한다!!! 이때 시퀀스란 배열, 딕셔너리, 세트, 문자열, 범위, 이터레이터 등을 말한다.
배열일때 배열의 각 요소가 클로저의 파라미터로 들어간다.
let numbers = [1, 2, 3, 4, 5]
let strings = numbers.map { String($0) }
let string = numbers.map { (num) -> String in
return "\(number)"
}
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의 각 요소가 클로저의 파라미터로 들어간다.
let numberSet: Set<Int> = [1, 2, 3, 4, 5]
let stringSet = numberSet.map { String($0) }
print(stringSet) // 출력: ["1", "2", "3", "4", "5"]
string을 이루는 char가 클로저의 파라미터로 들어간다.
let string = "hello"
let uppercaseChars = string.map { $0.uppercased() }
print(uppercaseChars) // 출력: ["H", "E", "L", "L", "O"]
✅ map과 compactMap
map은 옵셔널 타입을 반환할 수 있지만, compactMap은 옵셔널 값이 있는 요소를 제거하고 옵셔널이 해제된 값을 가진 요소만을 반환한다.
스위프트의 표준 라이브러리에서 제공되는 함수이다. filter 함수는 컬렉션의 요소를 걸러서 새로운 컬렉션으로 반환하는 고차함수이다.
func filter(_ isIncluded: (Element) throws -> Bool) rethrows -> [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 함수는 컬렉션의 모든 요소를 결합하여 단일 값으로 줄이는 고차 함수이다. 이 함수는 초기값과 클로저를 사용하여 컬렉셔느이 각 요소를 처리하고 결합하여 최종 결과를 생성한다.
func reduce<Result>(_ initialResult: Result, _ nextPartialResult: (Result, Element) throws -> Result) rethrows -> 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)