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)