Notice
Recent Posts
Recent Comments
Link
«   2025/04   »
1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30
Archives
Today
Total
관리 메뉴

J

[Swift] map 본문

Swift

[Swift] map

yujaehui 2024. 4. 19. 10:26

`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