맵, 필터, 리듀스

 

Map

  • 자신을 호출할 때, 매개변수로 전달된 함수를 실행하여 그 결과를 반환
  • Sequence, Collection 프로토콜을 따르거나 옵셔널은 모두 사용 가능
  • 사용 시, 컨테이너가 담고 있던 각각의 값을 매개변수를 통해 적용 후, 다시 컨테이너로 포장하여 반환
  • 이전에 알아본 for - in 구문과 크게 다르지 않다
  • B.U.T. 코드 재사용 측면, 컴파일러 최적화 측면에서 성능 차이 있다
  • 다중 쓰레드 환경에서도 예측지 못한 결과의 부작용을 방지 가능 -> (Thread-Safe ? )
let numbers = [1,2,3,4,5]
var doubledNum = []
var stringNum = []

//for - in
for number in numbers{
	doubledNum.append(number * 2)
    stringNum.append("\(number)")
}

//map
//클로저 간소화한 문법
doubledNum = numbers.map{ $0 * 2 }
stringNum = numbers.map{ "\($0)" }

 

Filter

  • 내부의 값을 걸러서 추출하는 고차함수
  • 맵과 마찬가지로 새로운 컨테이너에 값을 담아 반환
  • Map = 변형, Filter = 거르기
  • 반환 타입 = Bool
let numbers = [1,2,3,4,5]

//짝수 걸러내기
ler evenNumbers = numbers.filter{ $0 % 2 == 0 } // [2,4]

 

Reduce

  • 컨테이너 내부의 콘텐츠를 하나로 합하는 기능을 실행하는 고차함수
  • 두가지 형태로 구현됨
    • 1. 클로저가 각 요소를 전달받아 연산한 후 값을 다음 클로저 실행을 위해 반환하며 컨테이너를 순환
    • 2. 컨테이너를 순환하며 클로저가 실행되지만 클로저가 따로 결괏값을 반환하지 않은 형태
      • 대신 inout 매개변수를 사용하여 초깃값에 직접 연산을 실행함
let numbers = [1,2,3]

// 1번 형태 
//초깃값이 0이고 모든 값을 더한다
var sum: Int = numbers.reduce(0,{ (result: Int, next: Int) -> Int in
	print("\(result) + \(next)")
    // 0 + 1
    // 1 + 2
    // 3 + 3
    return result + next
})

// 2번 형태
//초깃값이 0이고 모든 값을 더한다
sum = numbers.reduce(into: 0,{ (result: inout Int, next: Int) in
	print("\(result) + \(next)")
    // 0 + 1
    // 1 + 2
    // 3 + 3
	result += next
})

+ Recent posts