/**
`고차 함수`
- 함수를 매개변수로 받는 함수
- 함수를 반환 값으로 사용하는 함수
- 대표적으로 map, filter, reduce가 있다.
*/
/**
`forEach`
- for-in 과의 차이점:
- for-in은 break, continue를 사용해 빠져ㅑ나올 수 있고, return을 사용하면 에러
- forEach의 경우 return을 사용해야 빠져나갈 수 있고, break, continue를 사용하면 에러
*/
/*구현체
func forEach(_ body: (Int) throws -> Void) rethrows
*/
//-------[for-in]-------
let array = [1,2,3,4,5]
for num in array {
if num == 2 {
break
}
print(num)
}
<출력>
//1
for num in array {
if num == 2 {
continue
}
print(num)
}
<출력>
//1
//3
//4
//5
// <오류>
for num in array {
if num == 2 {
return // 에러
}
print(num)
}
//-------[forEach]-------
array.forEach {
if $0 == 2 {
return
}
print($0)
}
<출력>
//1
//3
//4
//5
// <오류>
array.forEach {
if $0 == 2 {
//break or continue 사용 불가
}
print($0)
}
/**
`Filter`
- 컨테이너 내부의 값을 걸러서 추출
- filter를 매개 변수로 전달되는 함수의 반환 타입은 Bool
*/
/* 구현체
func filter(_ isIncluded: (String) throws -> Bool) rethrows -> [String]
*/
print(numbers.filter({(num) -> Bool in
num % 2 == 0
})) // prints [0, 2, 4]
print(numbers.filter{ $0 % 2 == 0 })
/**
`reduce`
- 컨테이너의 내부를 하나로 합쳐주는 기능
- 정수 배열이면 함수의 연산 결과로, 문자열이면 문자로 합쳐준다.
- 초깃값을 지정할 수 있다.
*/
/*구현체
func reduce<Result>(_ initialResult: Result, _ nextPartialResult: (Result, Int) throws -> Result) rethrows -> Result
*/
print(numbers.reduce(10, { (result: Int, current: Int) -> Int in
return result + current
})) // 10 + 0 + 1 + 2 + 3 + 4 + 5 = 25
let abc = ["a", "b", "c", "d"]
print(abc.reduce(""){
$0 + $1
}) // prints "abcd"