본문 바로가기
iOS/Swift 문법 심화 학습

고차함수 [ map, filter, reduce ]

by 황민우 2022. 2. 7.

정의

 - 전달 인자로 함수를 전달받거나 함수 실행의 결과로 함수를 반환하는 함수입니다.

 - map, filter, reduce와 같은 함수가 있습니다.


 

map

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

 

생성

- numbers라는 배열을 생성하겠습니다.

- numbers 배열의 요소들을 변경하기 위한 doubledNumbers, strings 변수를 생성하겠습니다.

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

 

사용

- map 메서드를 사용하는 방식은 다음과 같습니다.

- numbers에 map 메서드를 호출하고 map의 전달 인자 자리에 클로저를 사용했습니다.

- 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)
print(strings)

실행결과
// [0, 2, 4, 6, 8]
// ["0", "1", "2", "3", "4"]

 

- map메서드에서도 클로저에서 사용되는 매개변수, 반환 타입, 반환 키워드 생략과 후행 클로저 사용이 가능합니다.

doubledNumbers = numbers.map { $0*2 }

print(doubledNumbers)

실행결과
// [0, 2, 4, 6, 8]

filter

- 컨테이너 내부의 값을 걸러서(조건에 부합하는 요소만) 새로운 컨테이너로 추출하는 함수.

 

생성

- 요소를 갖고 있는 numbers 배열을 생성하겠습니다.

- numbers의 요소를 추출받을 filtered라는 이름의 배열을 생성하겠습니다.

let numbers: [Int] = [0, 1, 2, 3, 4]
var filtered: [Int] = [Int]()

 

사용

- 조건에 부합하는 요소를 작성할 evenNumbers라는 상수를 하나 생성하겠습니다.

- 변수를 사용해도, 상수를 사용해도 상관없으니 상황에 맞게 사용하시면 됩니다.

- numbers에 filter메서드를 호출하여, 클로저를 사용했습니다.

- 클로저 블록 내에서 조건식에 맞는 타입을 지정해 코드를 작성할 수 있습니다. 

let evenNumbers: [Int] = numbers.filter {
    (number: Int) -> Bool in
    return number % 2 == 0
}

print(evenNumbers)

 

- filter메서드에서도 클로저에서 사용되는 매개변수, 반환 타입, 반환 키워드 생략과 후행 클로저 사용이 가능합니다.

let evenNumbers: [Int] = numbers.filter { $0 % 2 != 0 }
print(evenNumbers)

실행결과
// [1, 3]

reduce

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

- for 구문을 사용하지 않아도 모든 요소를 더할 수 있습니다.

 

생성

- someNumbers라는 정수형 배열을 생성하겠습니다.

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

 

사용 : 값 더하기

- 초기값이 0이고, someNumbers 내부의 모든 값을 더하는 코드입니다.

- sum 상수를 만들고, someNumbers에 reduce를 호출해 클로저를 사용하였습니다.

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

let sum: Int = someNumbers.reduce(0, {(first: Int, second: Int) -> Int in
    return first + second
})

print(sum)

실행결과
// 25

 

사용 : 값 빼기

- 초기값이 0이고, someNumbers 내부의 모든 값을 빼는 코드입니다.

- 값 더하기 예제와 동일한 방법으로 코드를 작성했습니다.

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

let sum: Int = someNumbers.reduce(0, {(first: Int, second: Int) -> Int in
    return first - second
})

print(sum)

실행결과
// -25

 

사용 : 초기값 지정

- 초기값이 3이고, someNumbers 내부의 모든 값을 더하는 코드입니다.

- reduce메서드에서도 클로저에서 사용되는 매개변수, 반환타입, 반환키워드 생략과 후행 클로저 사용이 가능합니다.

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

let sumFromThree = someNumbers.reduce(3) { $0 + $1 }
print(sumFromThree)

실행결과
// 28

내용 출처

https://www.youtube.com/watch?v=HmabXrK2tRo&list=PLz8NH7YHUj_ZmlgcSETF51Z9GSSU6Uioy&index=29 

 

'iOS > Swift 문법 심화 학습' 카테고리의 다른 글

mutating  (0) 2022.02.09
제네릭 [ Generic ]  (0) 2022.02.08
오류 처리 [ error handling ]  (0) 2022.02.04
열거형 [ enum ]  (0) 2022.02.03
클래스 [ Class ]  (0) 2022.02.03

댓글