부끄럽지만 iOS 프로그래밍을 하며 고차함수에 대한 이론만 공부하고 제대로 실전에서 사용을 해본 적이 없었다.
요즘 이론을 다시 공부하며 고차함수에 대해 제대로 이해하고 사용법도 익혀보고자 이 글을 작성한다.
일단 Filter, Map, Reduce에 대해 정리하기 전, 고차함수란 무엇일까?!
다른 함수를 전달인자(argument)로 받거나 함수 실행의 결과로 함수를 반환하는 함수
스위프트의 함수가 일급객체라는 것을 아니 무슨 소리인지 이해가 간다.
https://yejprogramming.tistory.com/7
Swift) iOS 프로그래밍 함수, 1급객체, 클로저, 클래스
함수 함수의 타입 (자료형, 자료형, ...) -> 리턴형(Int, Int, ...) -> Int => 리턴형이 Void형이면 () 함수의 자료형 출력 print(type(of:함수몀)) func sum(num1 x: Int, sum2 y: Int) -> Int { return(x+y) //함수 정의 } sum(num1:
yejprogramming.tistory.com
* 또한 고차함수 이해를 위해서는 클로저를 공부하는 것이 바람직하다.
이제 매우매우매우 자주 쓰이는 map, filter, reduce 함수에 대해 알아보자.
map(_:)
Returns an array containing the results of mapping the given closure over the sequence’s elements.
시퀀스의 요소를 순회하며 클로저에 매핑한 결과를 포함하는 배열을 반환한다.
놀랍게도 이 한 줄의 설명만 봐서는 무슨 말인지 하나도 모르겠다!!
map은 컨테이너 내부에 기존 데이터를 변형(transform)하여 새로운 컨테이너를 생성한다.
새로운 컨테이너를 만들기 때문에 기존 데이터는 변형되지 않는다.
sequence, collection 프로토콜을 따르는 타입과 옵셔널은 모두 해당 함수를 사용할 수 있다. (array, dictionary, set, optional)
map은 for-in 구문 비슷한데. map을 사용하는 이유는 바로
코드의 간결성, 재사용 용이성, 컴파일러 최정화 성능이 좋다는 점이다.
이제 예시를 한 번 살펴보자!
짝수로 이루어진 배열의 각 요소들에 -1을 하여 홀수로 이루어진 배열을 만들어보자.
for-in
var array = [2,4,6,8,10]
var array2: [Int] = []
for i in array {
array2.append(i-1)
}
print(array2) // [1, 3, 5, 7, 9]
map
var oddNumArr = array.map { i -> Int in
i - 1
}
print(oddNumArr) //[1, 3, 5, 7, 9]
클로저로 축약해 밑에 처럼 표현할 수 있다.
var oddNumArr = array.map { $0 - 1 }
filter(_:)
Returns an array containing, in order, the elements of the sequence that satisfy the given predicate.
주어진 조건(predicate)에 만족하는 시퀀스의 요소를 포함하는 배열을 반환한다
앞에서 map은 데이터를 변형하고자 할 때 사용하였다.
filter은 데이터를 추출(filter)하고자 할 때 사용한다.
map과 마찬가지로 새로운 컨테이너를 만들기 때문에 기존 데이터는 변형되지 않는다.
for-in
var array = [1,2,3,4,5,6,7,8,9,10]
var array2: [Int] = []
for i in array {
if i%2==1 {
array2.append(i)
}
}
print(array2) // [1, 3, 5, 7, 9]
filter
var oddNumArr = array.filter { i -> Bool in
i%2==1
}
print(oddNumArr) // [1, 3, 5, 7, 9]
축약
var oddNumArr = array.filter { $0%2==1 }
reduce(_:)
Returns the result of combining the elements of the sequence using the given closure.
주어진 클로저를 사용하는 시퀀스의 요소를 결합한 결과를 반환한다.
reduce는 컨테이너 내부의 요소를 하나로 결합한다. (데이터를 합치기 위해 사용)
let numberArray = [1,2,3,4,5]
var sumFor = 0
for number in numberArray {
sumFor += number
}
let sumReduce = numberArray.reduce(0) { $0 + $1 }
print(sumFor) //15
print(sumReduce)//15
[출처]
https://shark-sea.kr/entry/Swift-고차함수-Map-Filter-Reduce-알아보기
https://minosaekki.tistory.com/21
https://jud00.tistory.com/entry/오늘의-Swift-지식-고차-함수-map-filter-reduce
https://velog.io/@un1945/Swift-고차함수-Higher-order-Function
https://donggyu9410.medium.com/swift-필수-문법-map-filter-reduce-compactmap-9c4c903804a8
'iOS > Swift이론' 카테고리의 다른 글
Swift의 비동기 처리 (2) | 2023.01.08 |
---|---|
[Swift] array! 배열에 대해 파헤쳐보자! (2) | 2022.12.28 |
UIKit (0) | 2022.05.23 |
Swift) 열거형 enum (2) | 2022.04.19 |
Swift) 프로토콜과 델리게이트 Protocol, Delegate (1) | 2022.04.12 |