맵, 필터, 리듀스
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
})
'Swift' 카테고리의 다른 글
[Swift] 서브스크립트 - 스위프트 언어 및 문법(12) - feat.야곰's Swift Programming (0) | 2021.01.18 |
---|---|
[Swift] 모나드 - 스위프트 언어 및 문법(11) - feat.야곰's Swift Programming (0) | 2021.01.18 |
[Swift] 옵셔널 체이닝 - 스위프트 언어 및 문법(9) - feat.야곰's Swift Programming (0) | 2021.01.15 |
[Swift] 클로저 - 스위프트 언어 및 문법(8) - feat.야곰's Swift Programming (0) | 2021.01.15 |
[Swift] 인스턴스 - 스위프트 언어 및 문법(7) - feat.야곰's Swift Programming (0) | 2021.01.14 |