- 고차함수(Higher-order function)
"다른 함수를 전달인자로 받거나 함수실행의 결과를 함수로 반환하는 함수"
- 스위프트 표준 라이브러리에서 제공하는 유용한 고차 함수
- map
- filter
- reduce
모두 Collection 타입에 구현이 되어있다.
- 컨테이너 내부의 기존 데이터를 변형하여 새로운 컨테이너를 생성
- 파이썬의 map과 비슷한 기능
// map let numbers = [0,1,2,3] let mapArray = numbers.map{ (num) -> Int in return num * 2 } print("mapArray : \(mapArray)") // -> [0, 2, 4, 6]
- 컨테이너 내부의 값을 걸러서 새로운 컨테이너로 추출
// filter let intArray = [10, 5, 20, 13, 4] let filterArray = intArray.filter { (num) -> Bool in return num > 5 } print(filterArray) // -> [10, 20, 13] // 클로저 간소화 표현 let filterArray2 = intArray.filter { $0 > 5 } print(filterArray2) // -> [10, 20, 13]
- 컨테이너 내부의 콘텐츠를 하나로 통합한다.
// reduce (축소하다) // 초기값이 0인 상태에서 모든 원소 더하기 // 컨테이너 내부의 콘텐츠를 "합" 으로 통합한다. let someArray = [1,2,3,4,5] let addResult = someArray.reduce(0) { (result: Int, element: Int) -> Int in print("\(result) + \(element)") return result + element } print(addResult) // -> 15 // 초기값이 1인 상태에서 모든 원소 곱하기 // 컨테이너 내부의 콘텐츠를 "곱" 으로 통합한다. let multiResult = someArray.reduce(1, {(result: Int, elem: Int) -> Int in return result * elem }) print(multiResult) // -> 120 // 클로저 축약 let multiResult2 = someArray.reduce(1) { $0 * $1 } print(multiResult2) // -> 120
// 혼자 연습해보기 let arr = [1,2,3,4,5,6,7,8] // 나 혼자 연습1 : 짝수만 걸러내기 let evenFilter = arr.filter { (num) -> Bool in return num % 2 == 0} print(evenFilter) let evenFilter2 = arr.filter { $0 % 2 == 0 } print(evenFilter2) // 나 혼자 연습2 : 문자열 타입으로 바꾸기 let toString = arr.map{ (num: Int) -> String in return "\(num)" } print(toString) let toString2 = arr.map { "\($0)" } print(toString2) // 나 혼자 연습3 : 모든 원소를 문자열에 담아 압축하기 let arrStr = arr.reduce ("") { (first, second) -> String in return "\(first)\(second)" } print(arrStr) let arrStr2 = arr.reduce(""){ "\($0)\($1)" } print(arrStr2)