관리 메뉴

김종권의 iOS 앱 개발 알아가기

[swift] 16. 고차 함수(Higher-order function) 본문

swift 5 문법

[swift] 16. 고차 함수(Higher-order function)

jake-kim 2020. 5. 24. 20:58

1. 고차함수(Higher-order function)란?

하나 이상의 함수를 인자로 취하거나 함수를 반환하는 함수를 의미
- higher order function: 함수 내부에서 일어나는 특성 (함수를 인수로 받는 것, 함수를 리턴하는 것)
- first class: 함수 외부에서 일어나는 특성 (함수를 변수에 대입 가능한 것)

 

ex) 배열에서 각 원소들을 접근하여 새로운 값을 생성하거나(map), 

  조건을 정하여 그 조건에 맞는 원소만 접근하거나(filter), 

  배열을 하나의 값으로 표현하거나(reduce) 

2. swift의 대표적인 고차함수

1) Map

콜렉션 내부의 기존 데이터를 변형(transform)하여 새로운 콜렉션 생성

 

* 아래 예제를 map을 이용해서 for문 없이 표현하면? 

let arr = [1,2,3]
var doubleArr: [Int] = [Int]()
for item in arr {
  doubleArr.append(item*2)
}

sol)

let arr = [1,2,3]
var doubleArr = arr.map { (n:Int) -> Int in
    return n * 2
}

* flatMap, compactMap 참고: ios-development.tistory.com/357

 

2) filter

콜렉션 내부의 기존 데이터를 돌면서 특정 조건에 맞는 것만 선택하는 것

 

* 아래 예제를 map을 이용해서 for문 없이 표현하면? 

let arr = [1,2,3,4,5]
var doubleArr: [Int] = [Int]()
for item in arr {
  if item % 2 == 0 {
      doubleArr.append(item*2)
  }
}

sol)

let arr = [1,2,3,4,5]
    var doubleArr = arr.filter{(n: Int) -> Bool in
      return n % 2 == 0
    }
}

 

3) reduce

콜렉션 내부의 컨텐츠를 하나로 결합 (...array to value)

.reduce(초기값) { (누적값 + 배열에 존재하는 값) }

 

* 아래 예제를 reduce를 이용하여 for문 없이 표현하면?

let arr = [1,2,3,4,5]
var sum = 0
for item in arr {
  sum += item
}

sol)

let arr = [1,2,3,4,5]
var sum = arr.reduce(0) {(first: Int, second: Int) -> Int in
  return first + second
}

/*
first=0, second=1
first=1, second=2
first=3, second=3
first=6, second=4
first=10, second=5
*/

 

Comments