[Swift] - 고차함수(Map,Filter,Reduce), allSatisfy, forEach

longlivedrgn·2023년 1월 2일
0

swift문법

목록 보기
25/36
post-thumbnail

Map 함수

  • 컨테이너 내부의 기존 데이터를 변형하여 새로운 컨테이너를 생성한다.

예를 통해서 map 함수를 익혀보자. 아래와 같이 numbers array와 빈 doubledNumbers array를 만들어보자

let numbers: [Int] = [0, 1, 2, 3, 4]
doubledNumbers = [Int]()

그리고, map함수를 통하여 numbers의 각 요소를 2배하여 새로운 배열을 반환해보자.

doubledNumbers = numbers.map({ (num: Int) -> Int in
    return num * 2
}

위의 코드는 생략을 통하여 아래와 같이 표현할 수 있다.

doubledNumbers = numbers.map { $0 * 2 }

Filter 함수

  • filter 함수는 컨테이너 내부의 값을 걸러서 새로운 컨테이너로 추출한다.
  • filter 의 매개변수로 전달되는 함수의 반환 타입은 Bool 이다.
  • true면 값을 포함하고, false면 값을 배재한다.
  • map과 마찬가지로 새로운 컨테이너를 생성하여 값을 반환한다.

이 또한, 예를 통하여 공부해보자. 아래와 같이 numbers array가 있다고 해보자.

let numbers: [Int] = [0, 1, 2, 3 ,4]

그리고, filter함수를 통하여 numbers 요소 중 짝수를 걸러내 새로운 배열로 변환해보자.

let evenNumbers: [Int] = numbers.filter { (num: Int) -> Bool in
    return num % 2 == 0
}

map 함수와 마찬가지로 아래와 같이 생략이 가능하다.

let oddNumbers: [Int] = numbers.filter { $0 % 2 == 0 }

Reduce 함수

  • 컨테이너 내부의 콘텐츠를 하나로 통합해준다.

예를 통하여 reduce 함수를 익혀보자. 먼저 아래와 같이 array가 있다고 생각해보자.

let someNumbers: [Int] = [2, 4, 6]

그리고 reduce함수를 통하여 someNumbers를 다 더해보자.(초깃값 : 0)

let sum: Int = someNumbers.reduce(0, {
    (first: Int, second: Int) -> Int in
    return first + second
})

또한, 아래와 같이 생략이 가능하다.

let sumFromThree = someNumbers.reduce(0) { $0 + $1 }

또다른 예.

let numbers: [Int] = [1,2,3,4,5]
var sum = numbers.reduce(0) { (result: Int, element: Int) -> Int in
    print("\(result) + \(element)")
    return result + element
}
0 + 1
1 + 2
3 + 3
6 + 4
10 + 5

allSatisfy() 메소드

  • 모든 원소가 특정 조건을 만족시키는 지 확인하고 싶을 때 사용한다.(배열을 순회 하면서 원소들이 특정 조건을 모두 만족하는지 확인할 때 사용)
  • Array, Dictionary, Set에서 사용한다.
  • 요소들이 다 true여야 최종적으로 true를 내뱉는다.
let numbers = [28, 32, 64, 90]
let passed = numbers.allSatisfy { $0 >= 28 }

forEach

그냥 간단한 예를 통해서 알아보자

let nums: [Int] = [1, 2, 3, 4]
 
nums.forEach {
    print($0)       // 1 2 3 4
}

Dictonary일 경우에도 아래와 같이 받을 수 있다. (Juice_Maker proeject에서 사용했음)

let dict: [String : Int] = ["Miro" : 24, "Alex" : 26]

dict.forEach {
	print(\($0.key), \($0.value))
}

⚠️ for - in 문과 forEach문의 차이점은?
1. continuebreakfor- in문에서는 사용이 가능하나, forEach문에서는 불가능하다.
2. for - in 문의 경우 return을 만나면 함수 자체가 종료가 된다. 그러나 forEach문의 경우 반복횟수에는 영향을 주지 않는다.

func printForIn() {
    let nums = [1, 2, 3]
  
    for num in nums {
        print(num)
        return
    }
} // 1

func printForEach() {
    let nums = [1, 2, 3]
 
    nums.forEach {
        print($0)
        return
    }
} // 1 2 3

📚 출처

[Swift] 28. 고차 함수 (map, filter, reduce)

Swift) for - in / forEach 제대로 알고 쓰기

0개의 댓글