swift study 18-1. 고차함수 (Higher-order Function)

jess·2022년 7월 29일
0

Swift

목록 보기
19/19
post-thumbnail

🍃 출처 : 앨런 swift 문법 마스터 스쿨 수업을 듣고 제가 이해한대로 정리해서 올리는 포스팅입니다.

📓 고차함수 (Higher-order Function)

1) 기본 고차함수와 활용

✨ 고차함수 : "함수"를 파라미터로 사용하거나,
함수실행의 결과를 "함수"로 리턴하는 함수
즉, 인풋이 함수이거나 아웃풋이 함수인 것

     - colletion(배열, 딕셔너리, 세트 등)에 기본적으로 구현되어 있는 함수
       (정확하게는 sequence, collection 프로토콜을 따르는 타입)
     - Optional 타입에도 구현되어 있음

✏️ 1. map 함수

let numbers = [1, 2, 3, 4, 5]
//numbers.map(<#T##transform: (Int) throws -> 
//                              T##(Int) throws -> T#>)
var newNumbers = numbers.map { (num) in
    return "숫자: \(num)"
}
newNumbers = numbers.map { "숫자: \($0)" }
//print(numbers)
//print(newNumbers)   
// ["숫자: 1", "숫자: 2", "숫자: 3", "숫자: 4", "숫자: 5"]
  • 기존 배열 등의 각 아이템을 새롭게 매핑해서 (매핑방식은 클로저가 제공) 새로운 배열을 리턴하는 함수
  • 각 아이템을 매핑해서, 변형하여 새로운 배열을 만들 때 사용한다

✏️ 2. filter 함수

let names = ["Apple", "Black", "Circle", "Dream", "Blue"]
//names.filter(<#T##isIncluded: (String) throws -> Bool##(String) throws -> Bool#>)
var newNames = names.filter { (name) -> Bool in
    return name.contains("B")
}
print(newNames)
  • 기존 배열 등의 각 아이템을 조건을 (조건은 클로저가 제공) 확인 후, 참(true)을 만족하는 아이템을 걸러내서 새로운 배열을 리턴
  • 각 아이템을 필터링해서, 새로운 배열을 만들 때 사용

✏️ 3. reduce 함수

var numbersArray = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
//numbersArray.reduce
// (<#T##initialResult: Result##Result#>, 
// <#T##nextPartialResult: (Result, Int) throws -> 
// Result##(Result, Int) throws -> Result#>)
var resultSum = numbersArray.reduce(0) { (sum, num) in
    return sum + num
}
print(resultSum)
  • 기존 배열 등의 각 아이템을 클로저가 제공하는 방식으로 결합해서 마지막 결과값을 리턴
  • 각 아이템을 결합해서 단 하나의 값으로 리턴

✏️ ⭐️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)
// 1, 9, 25, 49, 81 ===> 165
  • 1) filter : 홀수 뽑아내기
    2) map : 각각 하나하나 제곱
    3) reduce : 그 숫자를 다 더하기

2) 기타 고차함수

✏️ 4. forEach 함수

  • 기존 배열 등의 각 아이템을 활용해서 각 아이템별로 특정 작업
    (방식은 클로저가 제공)을 실행
  • 각 아이템을 활용해서 각각 특정 작업을 실행할 때 사용
let immutableArray = [1, 2, 3, 4, 5]
immutableArray.forEach { num in
    print(num)
}
immutableArray.forEach { print("숫자: \($0)") }
  • 이미 배열은 정해져 있고, 리턴타입 없이 클로저가 원하는 작업 실행

✏️ 5. compactMap 함수

  • 기존 배열 등의 각 아이템을 새롭게 매핑해서 (매핑방식은 클로저가 제공)
    변형하되, 옵셔널 요소는 제거하고, 새로운 배열을 리턴
  • map + 옵셔널 제거
  • 옵셔널은 빼고, 컴팩트하게 옵셔널 바인딩의 기능까지 내장
    // 1.
    let stringArray: [String?] = ["A", nil, "B", nil, "C"]
    var newStringArray = stringArray.compactMap { $0 }
    print(newStringArray)
    // 2.
    let numbers = [-2, -1, 0, 1, 2]
    var positiveNumbers = numbers.compactMap { $0 >= 0 ? $0 : nil }
    print(positiveNumbers)
    // 사실 이런 경우는 filter로 가능
    //numbers.filter { $0 >= 0 }
 - 컴팩트하게 매핑한다는 의미

✏️ 6. flatMap 함수

  • 중첩된 배열의 각 배열을 새롭게 매핑해서 (매핑방식은 클로저가 제공)
    내부 중첩된 배열을 제거하고 리턴
    (중첩 배열을 flat하게 매핑)
var nestedArray = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
print(nestedArray.flatMap { $0 })
var newNnestedArray = [[[1,2,3], [4,5,6], [7, 8, 9]], 
                      [[10, 11], [12, 13, 14]]]
var numbersArray = newNnestedArray
                            .flatMap { $0 }
                            .flatMap { $0 }
print(numbersArray)

0개의 댓글