맵, 필터, 리듀스

피터·2022년 8월 7일
0
post-thumbnail

Map(맵)

맵은 자신을 호출할 때 매개변수로 전달된 함수를 실행하여 그 결과를 다시 반환해주는 함수입니다.

스위프트의 Sequence, Collection 프로토콜을 따르는 타입과 옵셔널은 모두 맵을 사용할 수 있습니다.

맵을 사용하면 컨테이너가 담고 있던 각각의 값을 매개변수를 통해 받은 함수에 적용한 후 다시 컨테이너에 포장하여 반환합니다.

맵은 기존 데이터를 변형(transform)하는 데 많이 사용합니다.

let nums = [1234, 5678]

let numStr = nums.map { "\($0)" }

var result = "010"
for num in numStr {
    result += num
}
print(result) // 01012345678

map 메서드의 사용법은 for-in 구문과 큰 차이가 없습니다. 다만 코드이 재사용 측면이나 컴파일러 최적화 측면에서 본다면 성능 차이가 있습니다.

또, 다중 스레드 환경일 때 대상 컨테이너의 값이 스레드에서 변경되는 시점에서 다른 스레드에서도 동시에 값이 변경되려고 할 때 예측치 못한 결과가 발생하는 부작용을 방지할 수도 있습니다.

💡 map과 for 구문 사이에 어떤 것이 성능이 좋을까?
map이 더 좋습니다~!
출처: for-in과 고차함수(forEach, map, filter, reduce) 시간 비교

Filter(필터)

필터는 컨테이너 내부의 값을 걸러서 추출하는 역할의 고차함수입니다.

let nums = [0, 1, 2, 3, 4, 5, 6, 7]

let evenNums = nums.filter { $0 % 2 == 0 }

for num in evenNums {
    print(num, terminator:  " ")
}

// 0, 2, 4, 6

Reduce(리듀스)

리듀스 기능은 컨테이너 내부의 콘텐츠를 하나로 합하는 기능을 실행하는 고차함수입니다.

리듀스는 initialResult라는 이름의 매개변수로 전달되는 값을 통해 초기값을 지정해 줄 수 있으며, nextPartialResult라는 이름의 매개변수로 클로저를 전달받습니다.

func reduce<Result>(
    _ initialResult: Result,
    _ nextPartialResult: (Result, UInt8) async throws -> Result
) async rethrows -> Result

모든 순회가 끝나면 리듀스의 최종 결과값이 됩니다.

자료 출처: 야곰 스위프트 프로그래밍 3판

"이 포스팅은 쿠팡 파트너스 활동의 일환으로, 이에 따른 일정액의 수수료를 제공받습니다."
profile
iOS 개발자입니다.

0개의 댓글