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.
'iOS > Swift' 카테고리의 다른 글
[Swift 5.2] Methods - Apple Documentation (0) | 2020.03.05 |
---|---|
[Swift] ExpressibleByStringLiteral, CustomStringConvertible (0) | 2020.02.18 |
[Swift 5.2] Properties - Apple Documentation (0) | 2019.12.08 |
[Swift5.1] Overview (0) | 2019.12.04 |
[Swift] if let vs. guard let (0) | 2019.11.29 |