Higher-Order function (고차 함수)

  • 함수형 언어에서는 함수도 '값(value)'으로 취급
  • 함수를 파라미터로 전달할 수 있고, 반환도 할 수 있음.
  • Swift는 map, flatmap, filter, reduce 함수 제공

 

Map

  • Collection 기준으로 다른 Collection을 만들어 낼 때 사용
  • 파라미터에 Closure를 사용하여 array의 요소들을 변형 시킴.
let numbers = [1, 2, 3, 4, 5]

for number in numbers {
	let formateedNumber = "\(number)$"
    formateedNumbers.apend(formattedNumber)
}

let mappedNumbers = numbers.map { "\($0)$" }

 

FlatMap

  • Array의 차원을 1레벨 flat 해줌.
  • flatten() 메소드와 같은 결과 => flatten() + map = FlatMap
  • 3가지 경우일 때 사용
    1. non-nil인 결과들을 가지는 배열을 리턴
    2. 주어진 Sequence내의 요소들을 하나의 배열로써 리턴
    3. 주어진 Optional이 not-nil인지 판단 후 unwrapping하여 closure 파라미터로 전달
let optionalArray: [Int?] = [1, 2, 3, 4, nil]
// Optinal Array :  [Optional(1), Optional(2), Optional(3), Optional(4), nil]

let flatMappedArray = optionalArray.flatMap { $0 }
// flatMapped Array :  [1, 2, 3, 4]



let nestedArray = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
let flatMappedNestedArray = nestedArray.flatMap { $0 }
// flatMapped Nested Array :  [1, 2, 3, 4, 5, 6, 7, 8, 9]



let optional: Int? = 8
let value = optional.flatMap { $0 > 0 ? $0 : -$0 }
// value :  Optional(8)

 

하지만, 첫번째 경우(non-nil인 결과를 가지는 배열 리턴)에서 flatMap을 사용 시 deprecated되었다는 컴파일러의 응답!

=> 이런 경우에는 compactMap을 사용하라고 Swift 4.1부터 변경됨. (남용을 막기위해서 인 듯)

 

 

CompactMap

flatMap을 사용할 시에 단순히 non-nil 결과값들을 얻고 싶으면 compactMap()을 사용!!

 

let optionalArray: [Int?] = [1, 2, 3, 4, nil]
// Optinal Array :  [Optional(1), Optional(2), Optional(3), Optional(4), nil]

/*
 * flatMap() vs compactMap()
 */

let flatMappedArray = optionalArray.flatMap { $0 }
// flatMapped Array :  [1, 2, 3, 4]

let compactMappedArray = optionalArray.compactMap { $0 }
// compactMapped Array :  [1, 2, 3, 4]

 

 

 

Ref.

https://ontheswift.tistory.com/22

+ Recent posts