🍃 출처 : 앨런 swift 문법 마스터 스쿨 수업을 듣고 제가 이해한대로 정리해서 올리는 포스팅입니다.
✨ 고차함수 : "함수"를 파라미터로 사용하거나,
함수실행의 결과를 "함수"로 리턴하는 함수
즉, 인풋이 함수이거나 아웃풋이 함수인 것- colletion(배열, 딕셔너리, 세트 등)에 기본적으로 구현되어 있는 함수 (정확하게는 sequence, collection 프로토콜을 따르는 타입) - Optional 타입에도 구현되어 있음
✏️ 1. map 함수
let numbers = [1, 2, 3, 4, 5] //numbers.map(<#T##transform: (Int) throws -> // T##(Int) throws -> T#>) var newNumbers = numbers.map { (num) in return "숫자: \(num)" } newNumbers = numbers.map { "숫자: \($0)" } //print(numbers) //print(newNumbers) // ["숫자: 1", "숫자: 2", "숫자: 3", "숫자: 4", "숫자: 5"]
- 기존 배열 등의 각 아이템을 새롭게 매핑해서 (매핑방식은 클로저가 제공) 새로운 배열을 리턴하는 함수
- 각 아이템을 매핑해서, 변형하여 새로운 배열을 만들 때 사용한다
✏️ 2. filter 함수
let names = ["Apple", "Black", "Circle", "Dream", "Blue"] //names.filter(<#T##isIncluded: (String) throws -> Bool##(String) throws -> Bool#>) var newNames = names.filter { (name) -> Bool in return name.contains("B") } print(newNames)
- 기존 배열 등의 각 아이템을 조건을 (조건은 클로저가 제공) 확인 후, 참(true)을 만족하는 아이템을 걸러내서 새로운 배열을 리턴
- 각 아이템을 필터링해서, 새로운 배열을 만들 때 사용
✏️ 3. reduce 함수
var numbersArray = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10] //numbersArray.reduce // (<#T##initialResult: Result##Result#>, // <#T##nextPartialResult: (Result, Int) throws -> // Result##(Result, Int) throws -> Result#>) var resultSum = numbersArray.reduce(0) { (sum, num) in return sum + num } print(resultSum)
- 기존 배열 등의 각 아이템을 클로저가 제공하는 방식으로 결합해서 마지막 결과값을 리턴
- 각 아이템을 결합해서 단 하나의 값으로 리턴
✏️ ⭐️map / filter / reduce의 활용
numbersArray = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10] // 위의 배열 중에, 홀수만 제곱해서, 그 숫자를 다 더한 값은? var newResult = numbersArray .filter { $0 % 2 != 0 } .map { $0 * $0 } .reduce(0) { $0 + $1 } print(newResult) // 1, 9, 25, 49, 81 ===> 165
- 1) filter : 홀수 뽑아내기
2) map : 각각 하나하나 제곱
3) reduce : 그 숫자를 다 더하기
ㅡ
✏️ 4. forEach 함수
- 기존 배열 등의 각 아이템을 활용해서 각 아이템별로 특정 작업
(방식은 클로저가 제공)을 실행- 각 아이템을 활용해서 각각 특정 작업을 실행할 때 사용
let immutableArray = [1, 2, 3, 4, 5] immutableArray.forEach { num in print(num) } immutableArray.forEach { print("숫자: \($0)") }
- 이미 배열은 정해져 있고, 리턴타입 없이 클로저가 원하는 작업 실행
✏️ 5. compactMap 함수
- 기존 배열 등의 각 아이템을 새롭게 매핑해서 (매핑방식은 클로저가 제공)
변형하되, 옵셔널 요소는 제거하고, 새로운 배열을 리턴- map + 옵셔널 제거
- 옵셔널은 빼고, 컴팩트하게 옵셔널 바인딩의 기능까지 내장
// 1. let stringArray: [String?] = ["A", nil, "B", nil, "C"] var newStringArray = stringArray.compactMap { $0 } print(newStringArray) // 2. let numbers = [-2, -1, 0, 1, 2] var positiveNumbers = numbers.compactMap { $0 >= 0 ? $0 : nil } print(positiveNumbers) // 사실 이런 경우는 filter로 가능 //numbers.filter { $0 >= 0 }
- 컴팩트하게 매핑한다는 의미
✏️ 6. flatMap 함수
- 중첩된 배열의 각 배열을 새롭게 매핑해서 (매핑방식은 클로저가 제공)
내부 중첩된 배열을 제거하고 리턴
(중첩 배열을 flat하게 매핑)var nestedArray = [[1, 2, 3], [4, 5, 6], [7, 8, 9]] print(nestedArray.flatMap { $0 }) var newNnestedArray = [[[1,2,3], [4,5,6], [7, 8, 9]], [[10, 11], [12, 13, 14]]] var numbersArray = newNnestedArray .flatMap { $0 } .flatMap { $0 } print(numbersArray)