함수를 파라미터로 사용하거나, 함수의 실행 결과를 함수로 return 하는 함수를 고차 함수(Higher-order function)라고 부릅니다.
고차 함수는 스퀀스(Sequence), 컬랙션(Collection) 프로토콜을 따르는 컬렉션(배열, 딕셔너리, 세트 등)에 기본적으로 구현되어 있습니다.
Swift에는 사용자의 편의를 위해 기본적으로 구현되어있는 고차함수가 몇 개 존재하며, 그중에서 가장 대표적인 고차함수는 map{ }, filter{}, reduce(){}
입니다.
맵(map) 함수는 기존 컨테이너(배열, 딕셔너리, 세트 등의 저장공간) 공간의 데이터를 새롭게 매핑한뒤, 새로운 컨테이너를 반환하는 함수입니다.
기존 컨테이너의 데이터는 변경되지 않습니다. (원본값 유지)
✅ 맵(map) 함수 (축약 표현 없이 사용)
let numArr = [1,2,3,4,5] var newNumArr = numArr.map{(n: Int) -> String in return "\(n)!" } print(newNumArr) // ["1!", "2!", "3!", "4!", "5!"]
✅ 맵(map) 함수 (축약 표현 사용) ⭐️
let numArr = [1,2,3,4,5] var newNumArr = numArr.map{ "\($0)!" } print(newNumArr) // ["1!", "2!", "3!", "4!", "5!"]
필터(filter) 함수는 컨테이너 내부의 데이터를 걸러내서 새로운 컨테이너로 할당/반환하는 함수입니다.
조건식에서 참(true)을 만족하는 데이터(컨테이너 내부 데이터)만을 걸러냅니다.
✅ 필터(filter) 함수 (축약 표현 없이 사용)
let numArr = [1,2,3,4,5,6,7,8,9] var newNumArr = numArr.filter{(n: Int) -> Bool in return n % 2 == 0 // 배열의 값이 짝수이면 true 반환 / true인 데이터만 걸러냄 } print(newNumArr) // [2, 4, 6, 8]
✅ 필터(filter) 함수 (축약 표현 사용) ⭐️
let numArr = [1,2,3,4,5,6,7,8,9] var newNumArr = numArr.filter{ $0 % 2 == 0 // 배열의 값이 짝수이면 true 반환 } print(newNumArr) // [2, 4, 6, 8]
✅ 리듀스(reduce) 함수 (축약 표현 없이 사용)
let numArr = [1,2,3,4,5,6,7,8,9] var resultValue = numArr.reduce(0, {(a: Int, b: Int) -> Int in return a + b }) print(resultValue) // 45
✅ 리듀스(reduce) 함수 (축약 표현 사용) ⭐️
let numArr = [1,2,3,4,5,6,7,8,9] var resultValue = numArr.reduce(0){ // reduce(초기값) $0 + $1 } print(resultValue) // 45
포이치(forEach) 함수는 기존 컨테이너의 데이터를 사용하여 특정 작업을 실행하는 함수입니다.
맵(map) 함수와 기능면에서 비슷하지만, 새로운 컨테이너에 데이터를 할당할 필요가 없다는 특징을 가지고 있습니다.
✅ 포이치(forEach) 함수 (축약 표현 없이 사용)
let numArr = [1,2,3,4,5] numArr.forEach{(n: Int) -> Void in print("\(n)!") } /* 출력 결과 1! 2! 3! 4! 5! */
✅ 포이치(forEach) 함수 (축약 표현 사용) ⭐️
let numArr = [1,2,3,4,5] numArr.forEach{ print("\($0)!") } /* 출력 결과 1! 2! 3! 4! 5! */
컴팩트맵(compactMap) 함수는 옵셔널 타입으로 정의된 컨테이너에서 "nil"값을 제외한 데이터를 새로운 컨테이너에 할당/반환하는 함수입니다.
"nil"값이 아닌 옵셔널 타입의 데이터는 자동으로 옵셔널 바인딩 되어 새로운 컨테이너에 할당됩니다.
✅ 컴팩트맵(compactMap) 함수 (축약 표현 사용) ⭐️
let strArr: [String?] = ["h","e",nil,"l","l",nil,"o"] var newStrArr = strArr.compactMap{ $0 } print(newStrArr) // ["h", "e", "l", "l", "o"]
플랫맵(flatMap) 함수는 중첩된 컨테이너를 하나의 컨테이너로 새롭게 매핑하는 함수입니다.
플랫맵 함수는 한 번에 최대 한 겹의 중첩 컨테이너를 제거할 수 있습니다.
즉, 중첩된 컨테이너를 하나의 평평한 컨테이너로 만들어주는 함수입니다.
✅ 플랫맵(flatMap) 함수 (축약 표현 사용) ⭐️
let arr = [["a","b","c"],["i","j","k"]] // 이중 배열 var flatArr = arr.flatMap { $0 } print(flatArr) // ["a", "b", "c", "i", "j", "k"] // 단일 배열
✅ 플랫맵(flatMap) 함수는 한 번에 한 겹의 중첩 컨테이너만 제거 가능 ⭐️
let arr = [[1,2,3], [[4,5,6], [7,8,9]]] //[[이중], [[삼중], [삼중]]] var flatArr = arr.flatMap { $0 } print(flatArr) // [1, 2, 3, [4, 5, 6], [7, 8, 9]] => [단일, [이중], [이중]]