사실 고차함수에 대해서 알아보게 된 것은 swift 함수형 프로그래밍을 공부하다가 연관이 있기 때문에 넘어오게 되었다.
고차함수란?
'다른 함수를 전달인자로 받거나 함수실행의 결과를 함수로 반환하는 함수'라고 한다.
스위프트에서 함수는 일급객체(일급시민)이기 때문에 함수의 전달인자로 전달할 수 있으며, 함수의 결과값으로 반환할 수 있다.
여기서 나오는 일급객체는 무엇인가??
오늘은 스위프트 표준라이브러리에서 제공하는 3가지 유용한 고차함수에 대해서 공부해 볼 것이다.
- map
- filter
- reduce
(다음 글에선 sort, sorted)
1. map
map 함수는 컨테이너 내부의 기존 데이터를 변형하여 새로운 컨테이너를 생성한다.
map(_:)
Return Value
An array containing the transformed elements of this sequence.
예제로 int 배열을 string 배열로 바꿔보겠다.
let numbers : [Int] = [1, 3, 4, 5, 8, 10]
var textArray: [String] = numbers.map({ aNumber in
return "\(aNumber)입니다."
})
// ["1입니다.", "3입니다.", "4입니다.", "5입니다.", "8입니다.", "10입니다."]
또한 string 배열을 대문자, 소문자, 카운트 값을 구할 수 있다.
let name : [String] = ["Denis", "White", "Henry", "Peach"]
var lowercaseName : [String] = name.map { aString in
return aString.lowercased()
}
print(lowercaseName)
//["denis", "white", "henry", "peach"]
var upperCaseName : [String] = name.map { aString in
return aString.uppercased()
}
print(upperCaseName)
//["DENIS", "WHITE", "HENRY", "PEACH"]
var textCount : [Int] = name.map { aString in
return aString.count
}
print(textCount)
//[5, 5, 5, 5]
2. filter
filter 함수는 컨테이너 내부의 값을 걸러서 새로운 컨테이너로 추출한다.
filter(_:)
Return Value
An array of the elements that isIncluded allowed.
let numbers : [Int] = [1, 3, 4, 5, 8, 10]
var evenNumber : [Int] = numbers.filter { aNumber in
return aNumber % 2 == 0
}
print(evenNumber)
//[4, 8, 10]
여기서 의문점 저 둘의 이용을 바꿔봐도 될까?
에러가 난 것을 알 수 있다.
선언부분을 보면 그 이유를 알 수 있다.
map함수는 제너럴T를 이용해 변환을 목적으로 사용하고 있다.
filter 함수는 Bool값을 이용해 변환이 아닌 거르는 역할을 한다.
3. reduce
filter 함수는 컨테이너 내부의 값을 걸러서 새로운 컨테이너로 추출한다.
reduce(_:_:)
Return Value
The final accumulated value. If the sequence has no elements, the result is initialResult.
앞의 두 함수보다는 복잡하다고 느꼈다.
reduce함수는 초기결과값을 받고(initialResult) nextPartialResult에는 (초기결과값과 자신의 elememt를 받는다.)
let numbers = [1, 2, 3, 4]
let numberSum = numbers.reduce(0, { x, y in
x + y
})
// numberSum == 10
공식문서 선언 내용에 따르면 초기값은 0이고 x에 0이 대입된 상황에서 y에 numbers 배열이 들어가면서 더해지는 것 같다.
이를 좀 더 명확하게 확인해보기 위해서
let num: [Int] = []
var numberSub = num.reduce(2, {x, y in
return x + y
})
print(numberSub) // 2
빈 int 배열을 만들고
reduce함수의 초기값을 2로 선언하고 더해보면
결과는 2가 나온다.
오늘은 고차함수에 대해서 알아봤는데 공식문서와 함께 공부하니 좀 더 이해하기 쉽고 명확하게 알 수 있었다. (아직은 어렵..)
참고
https://developer.apple.com/documentation/swift/array/reduce(_:_:)
https://developer.apple.com/documentation/swift/array/map(_:)-87c4d
https://developer.apple.com/documentation/swift/sequence/filter(_:)
https://yagom.github.io/swift_basic/contents/22_higher_order_function/
'swift 기본 문법' 카테고리의 다른 글
Swift 고차함수) flatMap, compactMap 알아보기 (1) | 2022.09.15 |
---|---|
Swift lazy 알아보기 (0) | 2022.08.31 |
swift에서 일급 객체란? 알아보기 (0) | 2022.08.11 |
swift enum CaseIterable, map 알아보기 (0) | 2022.08.08 |
swift 정수형(integer), 부동소수형(Floating-point) (0) | 2022.07.03 |