iOS/Swift
[Swift] 맵, 필터, 리듀스(map, filter, reduce)
year.number
2022. 8. 15. 14:57
고차 함수
매개변수로 함수를 갖는 함수이며, 맵, 필터, 리듀스는 고차함수의 일종이다.
맵(map)
- 컨테이너 내부의 기존 데이터를 변형해서 새로운 컨테이너를 생성한다(컨테이너에 포장해서 반환)
- for-in 반복문과 비슷하게 사용할 수 있지만 성능에서 차이가 존재한다
// MARK: map
// 컨테이너 내부의 기존 데이터를 변형해서 새로운 컨테이너 생성(컨테이너에 포장해서 반환)
// ex)
// 배열 생성
let numbers: [Int] = [0, 1, 2, 3, 4]
var doubleNumbers: [Int]
var strings: [String]
// MARK: for-in 구문 사용
doubleNumbers = [Int]()
strings = [String]()
for number in numbers {
doubleNumbers.append(number * 2)
strings.append("\(number)")
}
print(doubleNumbers)
print(strings)
// MARK: map 메서드 사용
doubleNumbers = numbers.map({ (number: Int) -> Int in
return number * 2
})
strings = numbers.map({ (number: Int) -> String in
return "\(number)"
})
print(doubleNumbers)
print(strings)
// MARK: 매개변수, 반환타입, return 키워드 생략, 후행 클로저
doubleNumbers = numbers.map {$0 * 3}
print(doubleNumbers)
필터(filter)
- 컨테이너 내부의 값을 걸러서 새로운 컨테이너로 추출한다
- filter 함수의 매개변수로 전달되는 함수의 반환 타입은 Bool이다
// MARK: for-in 구문 사용
var filtered: [Int] = [Int]() // 짝수만 걸러서 넣을 빈 배열 생성
for number in numbers { // numbers 배열 요소들 중에서
if number % 2 == 0 { // 2로 나눈 나머지가 0일 경우(짝수일 경우)
filtered.append(number) // 짝수만 걸러서 넣는 빈 배열에 추가
}
}
print(filtered)
// MARK: filter 메서드 사용
let evenNum: [Int] = numbers.filter {
(number: Int) -> Bool in
return number % 2 == 0
}
print(evenNum)
// MARK: 매개변수, 반환타입, return 키워드 생략, 후행 클로저
let oddNum = numbers.filter {
$0 % 2 != 0
}
print(oddNum)
리듀스(reduce)
- 컨테이너 내부의 콘텐츠를 하나로 통합하는 기능을 실행한다
// **************************************************
// MARK: reduce
// 컨테이너 내부의 콘텐츠를 하나로 통합하는 기능을 실행
// MARK: for-in 구문 사용
var result: Int = 0
for number in numbers {
result += number
}
print(result)
// MARK: reduce 메서드 사용
//초기값이 0이고 numbers 내부의 모든 값 더하기
let sum: Int = numbers.reduce(0, {
(first: Int, second: Int) -> Int in
print("\(first) + \(second)")
return first + second
})
print(sum)