고차함수(map, filter, reduce)
- 추가적으로 : forEach, compactMap, flatMap
1. map함수
- 기존 배열 등의 각 아이템을 새롭게 매핑해서 새로운 배열을 리턴하는 함수
- 각 아이템을 매핑해서, 변형해서 새로운 배열을 만들때 사용
let numbers = [1, 2, 3, 4, 5]
1번방법
var newNumbers = numbers.map { (num) in
return "숫자: \(num)"
}
2번방법
클로저에서 파라미터와 in을 같이 생략하고 $0을 넣어줌
한줄이라면 return도 생략해도됨
newNumbers = numbers.map { "숫자: \($0)" }
-> 1번방법 2번방법 모두 똑같은 결과
2. filter함수
- 기존 배열 등의 각 아이템을 조건을 확인후, 참(true)을 만족하는 아이템을 걸러내서 새로운 배열을 리턴
- 각 아이템을 필터링해서, 걸러내서 새로운 배열을 만들때 사용
Case1. 이름거르기
let names = ["Apple", "Black", "Circle", "Dream", "Blue"]
var newNames = names.filter { (name) -> Bool in
return name.contains("B")
}
print(newNames)
클로저를 줄여보면 우선 return타입과 input과 in은 생략이 가능하다
var newNames2 = names.filter { $0.contains("A") }
print(newNames2)
Case2. 숫자거르기
let array = [1, 2, 3, 4, 5, 6, 7, 8]
var evenNumersArray = array.filter { num in
return num % 2 == 0
}
evenNumersArray = array.filter { $0 % 2 == 0 }
✅조건을 함수로 전달해보기✅
func isEven(_ i: Int) -> Bool {
return i % 2 == 0
}
array의 요소를 isEven에 input으로 주는 느낌
let evens = array.filter(isEven(_:))
print(evens)
3. reduce함수
- 기존 배열 등의 각 아이템을 클로저가 제공하는 방식으로 결합해서
마지막 결과값을 리턴(초기값 제공할 필요있음)
- 각 아이템을 결합해서 단 하나의 값으로 리턴
var numbersArray = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
누적을 하기때문에 초기값이 필요하다
var resultSum = numbersArray.reduce(0) { (a, b) in
return a + b
}
첫번째
0을 a에다가 넣는다, 배열의 첫번째 요소를 b에 넣는다 더한값이 초기값에 넣는다
두번째
(첫번째 결과가 초기값에 있다) 첫번째결과를 a에다가 넣고 두번째요소를 b에다 넣는다 더한값을 초기값에 넣는다
resultSum = numbersArray.reduce(100) { $0 - $1 }
100에서 첫번째요소를 빼서 초기값에 넣는다(99)
99에서 두번째요소를 빼서 초기값에 넣는다(97)
97에서 세번째요소를 뺴서 초기값에 넣는다(94)
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)
4. forEach함수
- 기존 배열 등의 각 아이템을 활용해서
각 아이템별로 특정 작업을 실행
- 각 아이템을 활용해서 각각 특정 작업을 실행할때 사용
let immutableArray = [1, 2, 3, 4, 5]
var sum = 0
immutableArray.forEach { sum += $0 }
5. compactMap함수
- 기존 배열 등의 각 아이템을 새롭게 매핑해서 변형하되, 옵셔널 요소는 제거하고, 새로운 배열을 리턴
- map + 옵셔널제거
- 옵셔널은 빼고, 컴팩트(compact)하게
- 옵셔널 바인딩의 기능까지 내장
let stringArray: [String?] = ["A", nil, "B", nil, "C"]
var newStringArray = stringArray.compactMap { $0 }
print(newStringArray)
6. flatMap함수
var nestedArray = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
print(nestedArray.flatMap { $0 })
3차원배열.flatMap => 2차원배열
2차원배열.flatMap => 1차원배열