[Swift] 고차 함수 (Higher-order function)

김상우·2021년 10월 29일
0
post-custom-banner

고차함수

  • 고차함수(Higher-order function)
    "다른 함수를 전달인자로 받거나 함수실행의 결과를 함수로 반환하는 함수"

스위프트 제공 고차 함수

  • 스위프트 표준 라이브러리에서 제공하는 유용한 고차 함수
  1. map
  2. filter
  3. reduce

모두 Collection 타입에 구현이 되어있다.

1. map

  • 컨테이너 내부의 기존 데이터를 변형하여 새로운 컨테이너를 생성
  • 파이썬의 map과 비슷한 기능
// map
let numbers = [0,1,2,3]
let mapArray = numbers.map{ (num) -> Int in
    return num * 2
}
print("mapArray : \(mapArray)")
// -> [0, 2, 4, 6]

2. filter

  • 컨테이너 내부의 값을 걸러서 새로운 컨테이너로 추출
// filter
let intArray = [10, 5, 20, 13, 4]
let filterArray = intArray.filter { (num) -> Bool in
    return num > 5
}
print(filterArray)  // -> [10, 20, 13]

// 클로저 간소화 표현
let filterArray2 = intArray.filter { $0 > 5 }
print(filterArray2) // -> [10, 20, 13]

3. reduce

  • 컨테이너 내부의 콘텐츠를 하나로 통합한다.
// reduce (축소하다)
// 초기값이 0인 상태에서 모든 원소 더하기
// 컨테이너 내부의 콘텐츠를 "합" 으로 통합한다.
let someArray = [1,2,3,4,5]
let addResult = someArray.reduce(0) {
    (result: Int, element: Int) -> Int in
    print("\(result) + \(element)")
    return result + element
}

print(addResult)    // -> 15

// 초기값이 1인 상태에서 모든 원소 곱하기
// 컨테이너 내부의 콘텐츠를 "곱" 으로 통합한다.
let multiResult = someArray.reduce(1, {(result: Int, elem: Int) -> Int in return result * elem
})

print(multiResult)  // -> 120

// 클로저 축약
let multiResult2 = someArray.reduce(1) { $0 * $1 }
print(multiResult2) // -> 120

Swift 연습 코드

// 혼자 연습해보기
let arr = [1,2,3,4,5,6,7,8]
// 나 혼자 연습1 : 짝수만 걸러내기
let evenFilter = arr.filter { (num) -> Bool in return num % 2 == 0}
print(evenFilter)

let evenFilter2 = arr.filter { $0 % 2 == 0 }
print(evenFilter2)

// 나 혼자 연습2 : 문자열 타입으로 바꾸기
let toString = arr.map{ (num: Int) -> String in
    return "\(num)"
}
print(toString)
let toString2 = arr.map { "\($0)" }
print(toString2)

// 나 혼자 연습3 : 모든 원소를 문자열에 담아 압축하기
let arrStr = arr.reduce ("") { (first, second) -> String in
    return "\(first)\(second)"
}
print(arrStr)

let arrStr2 = arr.reduce(""){ "\($0)\($1)" }
print(arrStr2)
profile
안녕하세요, iOS 와 알고리즘에 대한 글을 씁니다.
post-custom-banner

0개의 댓글