티스토리 뷰
[시작]
- 고차함수 : 매개변수로 함수를 갖는 함수
- Swift의 유용한 대표적인 고차함수 map, filter, reduce
[맵 map]
- 자신을 호출할 때 매개변수로 전달된 함수를 실행하여 그 결과를 다시 반환해주는 함수
- 배열, 딕셔너리, 세트, 옵셔널 등에서 사용 가능
: Sequence, Collection 프로토콜을 준수하는 타입과 옵셔널
- 기존 컨테이너의 값은 변경되지 않고 새로운 컨테이너가 생성되어 반환됨
- 기존 데이터를 변형하는 데 많이 사용함
1 2 3 4 | let array: [Int] = [1,2,3,4,5,6] let mappedArray = array.map { $0 * 2 } print(mappedArray) //2, 4, 6, 8, 10, 12 | cs |
- for-in 구문과 비교하여 성능상 이점
: 빈 배열을 생성하지 않아도 됨
: append 연산을 실행하기 위한 시간도 필요 없음
[필터 filter]
- 컨테이너 내부의 값을 걸러서 추출하는 함수
- 매개변수로 전달되는 함수의 반환형은 Bool
: 새로운 컨테이너에 포함될 항목이라면 true, 아니면 false를 반환
1 2 3 4 | let array: [Int] = [1,2,3,4,5,6] let mappedArray = array.filter { $0 % 2 == 0 } print(mappedArray) //2, 4, 6 | cs |
1 2 3 4 | let array: [Int] = [1,2,3,4,5,6] let mappedArray = array.filter { $0 % 2 == 0 }.map { $0 * 2 } print(mappedArray) //4, 8, 12 | cs |
[리듀스 reduce]
- 컨테이너 내부의 콘텐츠를 하나로 합함
- 전달받은 클로저의 연산 결과로 합해줌
- 첫 번째 리듀스 : 클로저가 각 요소를 전달받아 연산한 후 값을 다음 클로저 실행을 위해 반환하며 컨테이너를 순환
- 두 번째 리듀스 : 클로저가 결과값을 반환하지 않음, inout 매개변수로 정의된 초기값에 직접 연산을 실행하게 됨
1 2 3 4 5 6 7 8 9 10 11 12 | let array: [Int] = [1,2,3,4,5,6] let reduce1 = array.reduce(0) { (result, value) -> Int in return result + value } print(reduce1) //21 let reduce2 = array.reduce(into: 0) { (result, value) in result += value } print(reduce2) //21 | cs |
- 두 번째 리듀스를 사용하면 다른 컨테이너에 값을 변경하여 넣어줄 수도 있음
'Swift > 야곰의 스위프트' 카테고리의 다른 글
17장 서브스크립트 (0) | 2018.02.28 |
---|---|
16장 모나드 (0) | 2018.02.12 |
14장 옵셔널 체이닝과 빠른 종료 (0) | 2018.02.12 |
13장 클로저 (0) | 2018.02.12 |
12장 접근제어 (0) | 2018.02.05 |
댓글