ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [Swift] 고차함수
    iOS/개념정리 2022. 2. 17. 17:42

    고차함수는 다른 함수를 인자로 받거나 함수 실행 결과를 함수로 반환하는 함수

     

    스위프트에서 함수(클로저)는 일급시민이다.

     

    일급시민이란?

    1. 변수나 상수에 저장 및 할당 할 수 있어야 한다.

    ex)

    func firstCitizen(test: String) -> String {
        print("first")
        
        return test
    } 
    
    let abc = firstCitizen

    2. 파라미터로 전달 할 수 있어야 한다.

    ex)

    func fcTest(test: String) {
        print("2")
    }
    
    fcTest(test: firstCitizen("test"))

     

    3. 함수에서 return 할 수 있어야 한다.

    ex)

    func returnFunc() -> String {
        return firstCitizen(test: "test")
    }

     

     

    고차 함수에는 3가지 종류가 있다.

    • map
    • filter
    • reduce

    우선 첫번째로

     

    map

    map 은 컨테이너 내부에 기존 데이터를 변형하여 새로운 컨테이너에 저장한다.

    let numbers: [Int] = [0, 1, 2, 3, 4]
    var doubleNumbers: [Int]
    var strings: [String]

    이렇게 3가지 상수, 변수가 있는데 여기서 numbers를 가공하면 doubleNumbers는 numbers의 각각 2배를 곱한 값을,

    strings는 numbers를 string형으로 변환할 것입니다.

     

    일단 고차함수 map을 사용하지 않으면

    doubleNumbers = [Int]()
    strings = [String]()
    
    for number in numbers{
        doubleNumbers.append(number * 2) 
        strings.append("\(number)")
    }
    print(doubleNumbers) //[0, 2, 4, 6, 8]
    print(strings) //["0", "1", "2", "3", "4"]

    map을 사용하면

    doubleNumbers = numbers.map({
        (number: Int) -> Int in
        return number * 2
    })
    
    strings = numbers.map({ (number:Int) -> String in
        return "\(number)"
    })
    print(doubleNumbers) // [0, 2, 4, 6, 8]
    print(strings) //["0", "1", "2", "3", "4"]

     

     

    filter

    filter는 내부의 값을 걸러서 컨테이너에 추출한다.

     

    var filtered: [Int] = [Int]()
    
    for number in numbers {
        if number % 2 == 0 {
            filtered.append(number)
        }
    }
    
    print(filtered) // [0, 2, 4]

    위 방법은 filter를 사용하지 않은 방법이고 filter를 사용한 방법은 아래와 같다.

     

    let evenNumbers: [Int] = numbers.filter { (number: Int) -> Bool in return number % 2 == 0 }
    
    print(evenNumbers) //[0, 2, 4]

     

    reduce

    reduce는 콘텐츠를 하나로 통합 합니다.

    우선 reduce를 사용하지 않고 통합하자면

    let someNumbers: [Int] = [2, 8, 15]
    var result: Int = 0
    
    for number in someNumbers {
        result += number 
    }
    print(result) // 25

     

    아래는 reduce를 사용한 방법입니다.

    //초깃값이 0이고 someNumbers 내부의 모든 값을 더합니다.
    let sum: Int = someNumbers.reduce(0, { (first: Int, second: Int) -> Int in 
        print("\(first) + \(second)")
        /*
    	0 + 2
    	2 + 8
    	10 + 15
        */
        return first + second 
    })
    
    print(sum) // 25

    동작 과정은 주석과 같습니다.

    'iOS > 개념정리' 카테고리의 다른 글

    <Swift> Properties  (0) 2022.02.22
    <Swift> Delegate 활용  (0) 2022.02.21
    <Swift> Delegate  (1) 2022.01.25
    <Swift> Firebase 연동  (0) 2022.01.25
    Alamofire 이용한 Server 통신  (0) 2022.01.24

    댓글

Designed by Tistory.