iOS/문법

Swift 문법과 친해지기 - 고차함수 (map, filter, reduce)

HJ39 2022. 12. 26. 22:56

map

map은 데이터를 변형하고자 할 때 사용한다.

기존 데이터를 입력으로 넣으면 새로운 컨테이너를 반환한다.

 

□ 장점

  • for-in 구문과 큰 차이가 없지만 코드가 확 줄어든다는 장점이 있다.
  • 재사용하기 용이하다
  • 컴파일러 최적화 성능이 좋다.
let numArray = [1,3,5,7,9]

//for-in 사용
var multiArray2 = [Int]()
for num in numArray{
    multiArray2.append(num * 2)
}

// 원래 클로저 구문
let multiArray1 = numArray.map { (num: Int) -> Int in
    return num * 2
}

// 축약시킨 버전
let multiArray = numArray.map { $0 * 2 }

→ for-in을 사용했을 때 보다 map을 사용한 코드가 더 간단하다.

 

compactMap

Map 응용 버전으로 compact(압축)한 map이다.

Map을 이용하여 새롭게 데이터를 가공했을 때 nil값이 생길 수 있다.

이런 경우 nil 값을 제외한 후 새로운 컨테이너를 만들어준다.

 

 

Filter

filter는 데이터를 추출할 때 사용한다.

기존 컨테이너에서 내부의 값을 필터링하여 새로운 컨테이너로 반환한다.

 

let stringArray = ["A","AB","AC","ABD"]

// for-in 구문
var threeCountarray = [String]()
for st in stringArray{
    if st.count == 3{
        threeCountarray.append(st)
    }
}

// 클로저 사용
let threeCountArray2 = stringArray.filter { st in
    st.count == 3
}

// 축약 클로저 사용
let threeCountArray1 = stringArray.filter{ $0.count == 3}

→ filter의 경우도 for-in을 사용할 때보다 더 코드가 간결해진다.

 

Reduce

데이터를 합치기 위해 사용한다.

기존 컨테이너에서 내부의 값들을 결합하여 새로운 값을 생성한다.

 

let numberArray = [1,2,3,4,5,6,7,8,9,10]

// for-in 구문
var sum = 0
for num in numberArray{
    sum += num
}

// 클로저
let sum1 = numberArray.reduce(0) { first, second in
    first + second
}

// 축약 클로저
let sum2 = numberArray.reduce(0) {$0 + $1}

→ 배열을 돌면서 배열에 있는 값들을 모두 합하는 코드들이다.

→ reduce(초기 설정 result 값, 클로저 구문)으로 구성되어 있다 

 

 

# 참고한 사이트

  1. https://shark-sea.kr/entry/Swift-%EA%B3%A0%EC%B0%A8%ED%95%A8%EC%88%98-Map-Filter-Reduce-%EC%95%8C%EC%95%84%EB%B3%B4%EA%B8%B0