J
[Swift] map 본문
`map`, `compactMap`, `flatMap`은 Swift의 고차 함수로 컬렉션, 옵셔널, 시퀀스 등 변환 작업을 적용할 때 사용.
이들은 각기 다른 방식으로 데이터를 변환하고, 특정 조건에 따라 값을 필터링하거나 중첩된 구조를 평탄화.
1. `map`
컬렉션이나 옵셔널, 시퀀스의 각 요소에 주어진 변환 함수를 적용하여 새로운 컬렉션이나 값을 생성.
원래의 데이터 구조는 유지.
컬렉션에서 사용
let numbers = [1, 2, 3, 4]
let squaredNumbers = numbers.map { $0 * $0 }
print(squaredNumbers)
// 결과: [1, 4, 9, 16]
옵셔널에서 사용
let optionalValue: Int? = 3
let result = optionalValue.map { $0 * 2 }
print(result)
// 결과: Optional(6)
특징
- 변환된 값을 유지하지만, 데이터 구조는 변경하지 않음.
- `[Int]`는 여전히 `[Int]` 타입이고, I`nt?`는 여전히 `Int?`.
- 빈 요소는 그대로 유지.
- 빈 배열은 빈 배열로 반환.
- `nil` 옵셔널은 그대로 `nil`로 반환.
2. `compactMap`
`compactMap`은 `map`과 비슷하지만, 변환 과정에서 `nil` 값을 필터링하여 제거.
컬렉션에서 사용
let numbers = ["1", "2", "three", "4"]
let validNumbers = numbers.compactMap { Int($0) }
print(validNumbers)
// 결과: [1, 2, 4]
옵셔널에서 사용
let optionalNumbers: [Int?] = [1, nil, 3, nil, 5]
let unwrappedNumbers = optionalNumbers.compactMap { $0 }
print(unwrappedNumbers)
// 결과: [1, 3, 5]
- `compactMap`은 옵셔널 자체에는 사용되지 않으며, 컬렉션 내의 옵셔널 값을 다룰 때 주로 사용.
특징
- `nil` 값을 제거한 새 컬렉션 반환.
- 변환 후 유효한 값만 추출하기에 옵셔널의 배열에서 유효한 값만 필터링할 때 주로 사용.
3. `flatMap`
`flatMap`은 중첩된 데이터 구조를 평탄화(flatten)하면서 변환을 적용.
즉, 이중 배열이나 옵셔널의 옵셔널 같은 중첩 구조를 단순화할 때 사용.
컬렉션에서 사용
let nestedArray = [[1, 2, 3], [4, 5], [6]]
let flattenedArray = nestedArray.flatMap { $0 }
print(flattenedArray)
// 결과: [1, 2, 3, 4, 5, 6]
옵셔널에서 사용
let optionalValue: Int?? = 5
let unwrappedValue = optionalValue.flatMap { $0 }
print(unwrappedValue)
// 결과: Optional(5)
컬렉션 변환과 결합
let numbers = [1, 2, 3]
let results = numbers.flatMap { Array(repeating: $0, count: $0) }
print(results)
// 결과: [1, 2, 2, 3, 3, 3]
특징
- 중첩 구조를 단순화.
- `[[Int]]`는 `[Int]`로 평탄화.
- `Int??`는 `Int?`로 변환.
- 중첩된 배열이나 시퀀스 구조의 평탄화하거나 옵셔널의 옵셔널을 단순화할 때 주로 사용.
주요 차이점 요약 (표로 비교)
함수 | 주요 기능 | 데이터 구조 유지 | `nil` 처리 방식 |
`map` | 각 요소에 변환 적용 | 유지 | 그대로 유지 |
`compactMap` | 변환 후 nil 값을 제거 | 유지 | `nil`을 제거 |
`flatMap` | 변환 후 평탄화 | 평탄화 | `nil` 제거 및 중첩 해제 |
예제: 세 함수의 차이 비교
let nestedArray = ["1", "2", "three", "4"]
let mapResult = nestedArray.map { Int($0) }
let compactMapResult = nestedArray.compactMap { Int($0) }
let flatMapResult = [["1", "2"], ["three", "4"]].flatMap { $0.compactMap { Int($0) } }
print("map: \\(mapResult)") // 결과: [Optional(1), Optional(2), nil, Optional(4)]
print("compactMap: \\(compactMapResult)") // 결과: [1, 2, 4]
print("flatMap: \\(flatMapResult)") // 결과: [1, 2, 4]
'Swift' 카테고리의 다른 글
[Swift] @available (0) | 2024.05.19 |
---|---|
[Swift] #available (0) | 2024.05.19 |
[Swift] init (0) | 2024.04.18 |
[Swift] weak, unowned (0) | 2024.04.18 |
[Swift] self / Self (0) | 2024.04.18 |