본문 바로가기
Swift/기본

고차함수

by 밤새는탐험가 2024. 4. 15.

다른 함수를 전달인자로 받거나 함수실행의 결과를 함수로 변환하는 함수이다. 

 

스위프트에서 함수(클로저)는 일급 시민이기 때문에 

함수의 전달인자로 전달할 수 있고, 함수의 결과값으로 반환할 수 있다.

 

 

map

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

 

1️⃣ 변형하고자 하는 numbers / 변형 결과를 받을 doubledNumbers, strings

let numbers: [Int] = [0, 1, 2, 3, 4]
var doubledNumbers: [Int] = []
var strings: [String] = []

 

2️⃣ 기존의 for 구문 사용

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"]

 

3️⃣ 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"]

 

 

클로저에 후행 클로저를 적용하면 1줄로 표현할 수 있다.

 

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

 

 

 

filter

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

 

1️⃣ 기존의 for 구문 사용

var filtered: [Int] = [Int]()

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

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

 

 

2️⃣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]

 

 

 

reduce

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

 

✅ reduce 메서드에 전달하는 클로저의 매개변수 이름을 first, second 보다는 result 또는 currentItem 과같은 이름으로 선언하게 좋다.

✅ 첫 번째 매개변수는 초기값부터 시작해서 마지막 요소까지 순회하는 동안의 결과이다. 

✅ 두 번째 매개변수는 현재 순회하고 있는 요소의 값을 더한다. 

(즉, 이제까지 연산된 결과값에 순회하고 있는 차례의 요소를 연산한다는 뜻이다.)

 

 

1️⃣ 통합하고자 하는 someNumbers

let someNumbers: [Int] = [2, 8, 15]

 

2️⃣ 기존의 for 구문 사용

var result: Int = 0

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

print(result) // 25

 

3️⃣ reduce 메서드 사용

// 초깃값이 0이고 someNumbers 내부의 모든 값을 더합니다.
let sum: Int = someNumbers.reduce(0, { (first: Int, second: Int) -> Int in
    return first + second
})

print(sum)  // 25 


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

print(sumFromThree) // 28

 

 

 

'Swift > 기본' 카테고리의 다른 글

제네릭 (제네릭 제약, 제네릭 확장, 제네릭 함수와 오버로딩)  (0) 2024.04.16
제네릭  (0) 2024.04.15
오류처리  (0) 2024.04.13
익스텐션  (0) 2024.04.12
프로토콜  (0) 2024.04.11