🍎swift
고차함수
Kendrick
2023. 3. 7. 00:45
고차함수란
인풋을 함수로 사용하거나 함수의 결과를 함수로 리턴하는 함수
Dictionary, Set, Array (컬렉션)타입에서 주로 사용하지만, 특히 Array타입에서 많이 사용됨
고차함수에는 여러가지가 있지만 대표적으로 많이 사용되는 6가지가 있다.
또한 조합하여 특정 값을 만족시키는 값으로 구현 가능
접근법
점(.)문법을 통해 접근하고 클로저로 구현된다 따라서 문법최적화를 통해 보다 가독성 좋게 구현 가능
배열.map{ 클로저 }
배열.filer{ 클로저 }
01 Map 함수
각 아이템을 맵핑해서 사용
기존의 아이템을 각각 다른 새롭게 매핑해서 새로운 배열로 리턴함
var map01 = [1, 2, 3, 4, 5, 6]
var newmap = map01.map { ("숫자:\($0)") }
print(newmap) // ["숫자:1", "숫자:2", "숫자:3", "숫자:4", "숫자:5", "숫자:6"]
02 filter 함수
각 아이템을 필터링하여 참인 경우 출력
contains()함수를 활용하여 참인지 거짓인지 판별할 수 있는 기준을 줄 수 있다.
var filterFunc = ["철수","철구", "방구", "덕구"]
var newFilterFunc = filterFunc.filter { $0.contains("구") }
print(newFilterFunc) //["철구", "방구", "덕구"]
Map함수과 조합도 가능하다.(조합하여 사용 가능)
var filterFunc = ["철수","철구", "방구", "덕구"]
var newFilterFunc = filterFunc.filter { $0.contains("구") }.map { "회원명: \($0)" }
print(newFilterFunc) //["회원명: 철구", "회원명: 방구", "회원명: 덕구"]
03 reduce 함수
각 아이템을 결합하여 하나의 아이템(마지막 결과값)으로 리턴
결합하여 하나의 값으로 리턴하기 때문에 초기값 제공이 꼭 필요하다
var reduceFunc = [1,2,3,4,5,6,7,8,9,10]
var newReduceFunc = reduceFunc.reduce(3) { $0 + $1 }
//초기값 3을 넣고 1을 더함 -> $0 = 4
//4에서 2를 더하면 6이되고 $0 = 6
//6에서 3을 더하면 $0 = 9 .... 반복
print(newReduceFunc) //58
04 forEach 함수
각 아이템을 활용하여 수행
var stuNumber = ["철수", "영희", "짱구", "스티브"]
var name02 = stuNumber.forEach { name in
return print("학생이름 : \(name)")
}
//학생이름 : 철수
//학생이름 : 영희
//학생이름 : 짱구
//학생이름 : 스티브
05 compactMap 함수
- 바인딩 기능(옵셔널 타입을 벗길 수 있다)
- Map + 바인딩 기능(옵셔널 제거)
let compactFunc: [String?] = ["철수", nil, "철구", nil, "방구", "덕구"]
var newComapctFunc = compactFunc.compactMap { $0 }
print(newComapctFunc) //["철수", "철구", "방구", "덕구"]
comPactMap 함수가 기억나지 않는다면 filter 함수와 map함수로 구현도 가능함
var filterNewCompactFunc = compactFunc.filter { $0 != nil }
print(filterNewCompactFunc) //[Optional("철수"), Optional("철구"), Optional("방구"), Optional("덕구")]
//filter함수만 사용 시 optional 값이 벗겨지지 않음.
var filterNewCompactFunc = compactFunc.filter { $0 != nil } . map { $0!}
print(filterNewCompactFunc) //["철수", "철구", "방구", "덕구"]
// map함수를 사용하여 바인딩
06 flatMap 함수
flat말그대로 평탄하게 만들어주는 함수
- 중첩된 배열을 하나의 배열로 평탄화 작업을 시킴
- 다중 중첩 배열도 하나의 배열로 가능
var flatFunc = [["A", "B"], ["C", "D"], ["E", "F"]]
print(flatFunc.flatMap { $0 }) //["A", "B", "C", "D", "E", "F"]
//아래와 같이 as연산자와 타입케스팅을 통해 하나의 배열로 출력 가능
var flatfunc2 = [[[1,2]], [[9,10]], [24,32], [0,3,["A","B"]], ["C","D"], ["E","F"]]
var newFlatFunc2 = flatfunc2.flatMap { $0 }
.flatMap { $0 as? [Int] ?? [] }
print(newFlatFunc2) // [1, 2, 9, 10, 24, 32, 0, 3]
//filter를 통해 값을 한번 더 걸러낼 수 있다.
var flatfunc3 = [[[1,2]], [[9,10]], [24,32], [0,3,["A","B"]], ["C","D"], ["E","F"]]
var newFlatFunc3 = flatfunc3.flatMap { $0 }
.flatMap { $0 as? [Int] ?? [] }
.filter { $0 > 5 }
print(newFlatFunc3) // [9, 10]