ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [Swift] 맵, 필터, 리듀스(map, filter, reduce)
    iOS/Swift 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)

     

    'iOS > Swift' 카테고리의 다른 글

    [Swift] 서브스크립트(subscript)  (0) 2022.08.20
    [Swift] 모나드(Monad)  (0) 2022.08.15
    [Swift] 옵셔널 체이닝(Optional Chaining)  (0) 2022.08.11
    [Swift] 클로저  (0) 2022.08.09
    [Swift] 접근 제어  (0) 2022.08.05
Designed by Tistory.