본문 바로가기
iOS/Swift

Swift-11. 고차 함수 - map, filter, reduce

by 헤콩 2023. 2. 24.
반응형

** edwith - Swift 프로그래밍 입문 강의 참고 **

 

 

# 고차함수 #

- 고차함수(Higher-order-function)는 '다른 함수를 전달인자로 받거나 함수 실행의 결과를 함수로 반환하는 함수'를 말합니다.

- 고차함수 중에서도 map, filter, reduce 함수는 스위프트 표준 라이브러리의 컨테이너 타입(Array, Set, Dictionary 등)에 구현되어 있습니다.

 


[ map ]

- 컨테이너 내부의 기존 데이터를 변형하여 새로운 컨테이너를 생성

/* 변형하고자 하는 numbers와 변형 결과를 받을 dn, str 선언 */
let numbers: [Int] = [0, 1, 2, 3, 4]
var dn: [Int]
var str: [String]




/* 1. 기존의 for 구문 사용 */
dn = [Int]()
str = [String]()

for n in numbers {
    dn.append(n*2)
    str.append("\(n)")
}

print(dn) // [0, 2, 4, 6, 8]
print(str) // ["0", "1", "2", "3", "4"]




/* 2. map 메서드 사용 */
dn = numbers.map({ (n: Int) -> Int in
    return n*2
}) // map의 매개변수로 함수가 들어가요

str = numbers.map({ (n: Int) -> String in
    return "\(n)"
})

print(dn) // [0, 2, 4, 6, 8]
print(str) // ["0", "1", "2", "3", "4"]




/* 3. map에서 매개변수, 반환 타입, 반환 키워드 생략 가능 */
dn = numbers.map { $0 * 2 }
str = numbers.map { "\($0)" }

print(dn) // [0, 2, 4, 6, 8]
print(str) // ["0", "1", "2", "3", "4"]

[ filter ]

- 컨테이너 내부의 값을 걸러서 새로운 컨테이너로 추출

/* 1. 기존의 for 구문 사용 */
var filtered: [Int] = [Int]()

for n in numbers {
    if n%2==0 {
        filtered.append(n)
    }
}

print(filtered) // [0, 2, 4]




/* 2. filter 메서드 사용 */
let evenNum: [Int] = numbers.filter { (n: Int) -> Bool in
    return n%2==0
}

print(evenNum) // [0, 2, 4]




/* 3. filter 메서드에서 매개변수, 반환 타입, 반환 키워드 생략 가능 */
let oddNum: [Int] = numbers.filter { $0%2==1 }

print(oddNum) // [1, 3]

[ reduce ]

- 컨테이너 내부의 콘텐츠를 하나로 통합

/* 통합하고자 하는 someNum */
let someNum: [Int] = [2, 8, 15]




/* 1. 기존의 for 구문 사용 */
var result: Int = 0

for n in someNum {
    result += n
}

print(result) // 25




/* 2. reduce 메서드 사용 */
let sum: Int = someNum.reduce(0, { (first: Int, second: Int) -> Int in
    // 초기값이 0 이고 내부의 모든 값을 더해요
    return first+second
})

print(sum) // 25




/* 3. reduce 메서드 간단히 */
let sum2 = someNum.reduce(3) { $0 + $1 }

print(sum2) // 28
반응형

댓글