[Swift] 고차함수(1) - forEach, filter, reduce

728x90

고차함수(Higher-order-function)중 forEach, filter, reduce에 대해 알아 보겠습니다.

 

forEach

for-in과 동일하게 각각의 Element들을 호출 합니다.

 

Declaration

func forEach(_ body: (Int) throws -> Void) rethrows

 

Example

let array = [1,2,3,4,5]

for num in array {
    print(num)
}

<출력>
//1
//2
//3
//4
//5

array.forEach {
    print($0)
}

<출력>
//1
//2
//3
//4
//5

차이점

forEach에서는 break, continue 구문을 사용할 수 없고,
return을 통해서 빠져나갈 수 있습니다. (continue처럼 동작함)

 

for-in에서는 break, continue을 사용할 수 있고,
return을 이용해서 빠져나오려면 에러가 납니다.

//-------[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을 반환합니다.
true이면 값을 포함하고 false이면 값을 배제 합니다.

 

Declaration

func filter(_ isIncluded: (String) throws -> Bool) rethrows -> [String]

 

Example

let names = ["Chris", "Alex", "Ewa", "Barry", "Daniella"]

print(names.filter { $0 == "Alex" })

<출력>
// ["Alex"]

let numbers = [1,2,3,4,5,6]
let evenValues = numbers.filter { (num) -> Bool in
    return num % 2 == 0
}
print(evenValues)

<출력>
// [2, 4, 6]

 

Reduce

문자열이든 정수든 내부를 하나로 합쳐주는 기능을 합니다.
첫 번째 매개변수는 초깃값이고, 최초의 값($0)으로 사용됩니다.

 

Declaration

func reduce<Result>(_ initialResult: Result, _ nextPartialResult: (Result, Int) throws -> Result) rethrows -> Result

 

Example

//====== 정수 ======//

// 동일한 문법
(1...50).reduce(0) { (sum, nextValue) -> Int in
    return sum + nextValue
}

(1...50).reduce(0) {
    $0 + $1
}

<출력>
// 1275

//====== 문자열 ======//

["1","2","3","4","5"].reduce("") { (strSum, str) in
    return strSum + str
}

["1","2","3","4","5"].reduce("") {
    $0 + $1
}

<출력>
//"12345"