Swift: Higher Order Function / 고차함수 / map / filter / reduce

Wooyo·2023년 10월 24일
0
post-thumbnail

1. 고차함수

  • 다른 함수를 전달인자로 받거나 실행 결과를 함수로 반환하는 함수
  • 클로저 전달 가능
  • map / filter / reduce 가 대표적
  • 컨테이너 타입인 Array / Set / Dictionary 등에 구현되어 있음

2. map

  • 기존 데이터를 변형하여 새로운 컨테이너 생성
let numbers: [Int] = [0, 1, 2, 3, 4]
var doubledNumbers: [Int]
var strings: [String]
  • 기존 for
doubledNumbers = [Int]()
strings = [String]()

for number in numbers {
    doubledNumbers.append(number * 2)
    strings.append("\(number)")
}

print(doubledNumbers) // [0, 2, 4, 6, 8]
print(strings) // ["0", "1", "2", "3", "4"]
  • map 메서드 사용
// numbers의 각 요소를 2배하여 새로운 배열 반환
doubledNumbers = numbers.map({ (number: Int) -> Int in
    return number * 2
})

// numbers의 각 요소를 문자열로 변환하여 새로운 배열 반환
strings = numbers.map({ (number: Int) -> String in
    return "\(number)"
})

print(doubledNumbers) // [0, 2, 4, 6, 8]
print(strings) // ["0", "1", "2", "3", "4"]

// 매개변수, 반환 타입, 반환 키워드(return) 생략, 후행 클로저
doubledNumbers = numbers.map { $0 * 2 }
print(doubledNumbers) // [0, 2, 4, 6, 8]

3. filter

  • 컨테이너 내부값을 걸러 새로운 컨테이너로 추출
  • 기존 for 구문
var filtered: [Int] = [Int]()

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

print(filtered) // [0, 2, 4]
  • filter 메서드 사용
// numbers의 요소 중 짝수를 걸러내어 새로운 배열로 반환
let evenNumbers: [Int] = numbers.filter { (number: Int) -> Bool in
    return number % 2 == 0
}
print(evenNumbers) // [0, 2, 4]

// 매개변수, 반환 타입, 반환 키워드(return) 생략, 후행 클로저
let oddNumbers: [Int] = numbers.filter {
    $0 % 2 != 0
}
print(oddNumbers) // [1, 3]

4. reduce

  • 컨테이너 내부의 컨텐츠를 하나로 통합
let someNumbers: [Int] = [2, 8, 15]
  • 기존 for 구문
var result: Int = 0

// someNumbers의 모든 요소를 더함
for number in someNumbers {
    result += number
}

print(result) // 25
  • reduce 메서드 사용
// 초깃값이 0이고 someNumbers 내부의 모든 값을 더함
let sum: Int = someNumbers.reduce(0, { (first: Int, second: Int) -> Int in
    //print("\(first) + \(second)") 
    return first + second
})

print(sum)  // 25

var subtract: Int = someNumbers.reduce(0, { (first: Int, second: Int) -> Int in
    //print("\(first) - \(second)")
    return first - second
})

print(subtract) // -25

// 초깃값이 3이고 someNumbers 내부의 모든 값을 더함
let sumFromThree = someNumbers.reduce(3) { $0 + $1 }

print(sumFromThree) // 28
profile
Wooyo의 개발 블로그

0개의 댓글