map
- 아래와 같이 각 요소에 대한 값을 변경할 때 사용이 된다.
- 배열의 형태로 반환이된다.
func map<T>(_ transform: (String) throws -> T) rethrows -> [T]
[Swift] - 고차함수(Map,Filter,Reduce), allSatisfy, forEach
compactMap
- map을 해주는 동시에 nil을 제거하고 옵셔널 바인딩을 해준다.
func compactMap<ElementOfResult>(_ transform: (Int?) throws -> ElementOfResult?) rethrows -> [ElementOfResult]
flatMap
- map을 해주는 동시에 nil을 제거하고 옵셔널 바인딩을 해준다.
- 중첩된 배열을 제거한다.
- 1차원 배열로 flatten하게 해준다.
func flatMap<SegmentOfResult>(_ transform: ([Int]) throws -> SegmentOfResult) rethrows -> [SegmentOfResult.Element] where SegmentOfResult : Sequence
compactMap vs flatMap
- compactMap
let possibleNumbers = ["0", "2", "three", "사", "5"]
let compactMapped = possibleNumbers.compactMap { str in Int(str) }
// [0, 2, 5]
- flatMap
let notYetFlatMapped = [[1], [2, 3], [4, 5, 6], [7, 8, 9, 10]]
let flatMapped = notYetFlatMapped.flatMap { $0 }
print(flatMapped)
// [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
map VS compactMap
- 아래의 경우에는 map을 쓰던 compactMap을 쓰던 상관이 없다.
- 어떠한 자료형을 String으로 바꾸는 것은 그냥 “ “을 붙히면 되기에 optional이 될 수가 없다.
- 따라서 그냥 map으로 구현이 가능하다.
let operators = Operator.allCases.map { String($0.rawValue) }
- 그러나, 아래의 케이스는 compactMap만 사용이 가능하다.
- String과 다르게 Double을 만들어주는 경우, 모든 자료형을 Double로 만들 수는 없기 때문이다.
- ex) Double(“Miro”) ⇒ 불가능
- ex) String(1) ⇒ 가능
let operandsList = operandElements.compactMap { Double($0) }
📚 참고자료
'Swift' 카테고리의 다른 글
[Swift] 배열 안전하게 조회하기 (0) | 2023.02.04 |
---|---|
[Swift] Optional (0) | 2023.02.04 |
[Swift] 메타타입 (0) | 2023.02.03 |
[Swift] Generic (0) | 2023.02.03 |
[Swift] Protocol (0) | 2023.02.03 |