본문 바로가기
FRONT-END/iOS

Swift 고차함수 (map, filter, reduce)

by 랄라J 2023. 8. 4.

고차함수

  • 함수를 파라미터로 받거나, 함수의 결과 값으로 함수를 리턴하는 함수 (input이나 output이 함수인 함수)
  • 대표적으로 map, filter, reduce가 있음 (forEach, compactMap, flatMap)
  • Sequance, Collection 프로토콜을 따르는 컬렉션에 기본적으로 구현되어 있는 함수

 

map

  • 기존 배열의 각 값들을 새롭게 매핑해 새로운 배열을 리턴하는 함수 (매핑 방식은 클로저가 제공)
let numbers = [1, 2, 3, 4, 5]

// numbers.map(transform: (Int) throw -> T)
let newNumbers = numbers.map{num in
    return num + 1
}

// 위와 동일하나 간소화된 문법
// let newNumbers = numbers.map{$0 + 1}

print(newNumbers) // [2, 3, 4, 5, 6]

 

filter

  • 기존 배열의 각 값들의 조건 충족 여부를 확인해 조건에 충족하는 값만을 선별해 새로운 배열을 리턴하는 함수 (조건은 클로저가 제공)
let names = ["Rarla", "Christina", "Bailey", "Homes"]

// names.filter(isIncluded: (String) throws -> Bool)
let newNames = names.filter{ name in
    name.contains("a")
}

print(newNames) // ["Rarla", "Christina"]

 

reduce

  • 기존 배열의 각 값들을 클로저가 제공하는 방식으로 결합해서 마지막 값(단 하나의 값)을 리턴하는 함수 
let numbers = [1,2,3,4,5]

// numbers.reduce(initialResult: Result, nextPartialResult: (Result -> Int) throws -> Result)

let result = numbers.reduce(0, { a, b in
    a + b
})

print(result) // 15

 

reduce 활용 - 모든 값 더하기

let numbers = [1,2,3,4,5]
numbers.reduce(0,+)

 

forEach

  • 기존 배열에 각 값들을 활용해서 각 값마다 특정 작업을 실행하는 함수
let numbers = [1,2,3]

numbers.forEach{num in
    print(num)
}

 

compactMap

  • 기존 배열의 각 값들을 새롭게 매핑해서 변형하되, 옵셔널 요소는 제거하고 새로운 배열을 리턴
  • map + 옵셔널제거, 즉 옵셔널을 빼고 컴팩트하게 변환
let optionalArray: [String?] = [1, nil, 2, nil]
 
let newOptionalArray = optionalArray.compactMap()

// newOptionalArray Type은 [String]
print(newOptionalArray) // [1, 2]

 

flatMap

  • 중첩된 배열의 각 배열을 새롭게 매핑해서 내부 중첩된 배열을 한 겹 제거하고 리턴
let nestedArray = [ [1,2,3], [4,5,6], [7,8,9]]
nestedArray.flatMap{ $0 } // [1,2,3,4,5,6,7,8,9]
반응형

'FRONT-END > iOS' 카테고리의 다른 글

Swift 델리게이트 패턴 이해하기  (0) 2023.08.07
Swift 메모리 관리(ARC)  (0) 2023.08.06
Swift 클로저(Closure)  (0) 2023.08.04
iOS 앱이 만들어지는 원리 (Web과 비교)  (0) 2023.08.02
Swift의 self vs Self 이해하기  (0) 2023.08.02

댓글