고차함수 : Map, Filter, Reduce의 이해

박형석·2021년 11월 30일
0

Swift

목록 보기
7/20
post-thumbnail

고차함수

  • 매개변수로 함수를 갖는 함수
  • map, filter, reduce

Map

  • 컨테이너가 담고 있던 각각의 값을 매개변수로 전달된 함수를 적용한 후 다시 컨테이너에 포장해서 반환하는 함수
  • 기존 컨테이너 값 변경X, 새로운 컨테이너를 만들어 반환
  • Sequence, Collection 프로토콜을 따르는 타입, Optional은 모두 맵을 사용할 수 있음
    ex_ 배열, 딕셔너리, 세트, 옵셔널 등
  • for-in 과 비교해 재사용과 컴파일 최적화 측면에서 성능적으로 좋음
  • 다중 스레드 환경일 때 대상 컨테이너의 값이 스레드에 변경되는 시점에 다른 스레드에서도 동시에 값이 변경되려고 할 때 예측하지 못한 결과가 발생하는 부작용을 방지할 수도 있음.
  • 다른 컬렉션 타입을 위한 map, filter, reduce도 있음. 딕셔너리의 경우 mapValue, compactMapValue, flatMapValue 등으로 키 값에 적용할 수 있는 함수가 있다.

Filter

  • 컨테이너 내부의 값을 걸러서 추출하는 역할
  • 맵과 마찬가지로 새로운 컨테이너에 넣어서 반환
  • 매개변수로 전달하는 함수는 반환값이 Bool → true일 경우 포함 / false일 경우 필터됌

Reduce

  • 컨테이너 내부의 콘텐츠를 하나로 합하는 기능, 결합(combine)
  • 두 가지 형태로 구현되어 있다
  1. 클로저가 각 요소를 전달받아, 연산한 후의 값을 다음 클로저 실행을 위해 반환. 이렇게 클로저가 계속 순환
// 연산 후의 반환 값이 nextPartialResult의 전달인자로 들어가서 다시 연산
public func reduce<Result>(_ initialResult: Result, _ nextPartialResult: (Result, Element) throw -> Result) rethrow -> Result 
  1. 클로저가 따로 결과값을 반환하지 않는 형태. inout 매개변수를 사용해여 초기값의 상태를 변경
public func reduce<Result>(into initialResult: Result, _ updateAccumulattingResult: (inout Result, Element) throw -> ()) rethrow -> Result
profile
IOS Developer

0개의 댓글