map
- 시퀀스의 요소에 주어진 클로저를 매핑한 결과가 담긴 배열을 반환
compactMap
- 시퀀스의 각 요소에 변형을 준 뒤, nil이 아닌 결과가 담긴 배열을 반환
둘의 차이점은?
"compactMap은 nil이 아닌 값들만 선택적으로 반환한다"
예시
let test: [String] = ["1", "/2/", "three", "5", "1s"]
해당 배열에서 Int로 변형할 수 있는 요소들만 가져오려고 할 때, Int값의 리턴 타입은 Int? 이다.
옵셔널인지 확인해보자.
let stringOfInt = "456"
print(Int(stringOfInt)) // Optional(456)
let stringOfDouble = "0.01"
print(Int(stringOfDouble)) // nil
이제 옵셔널 타입임을 확인할 수 있으니 map과 compactMap을 적용해보자
let test: [String] = ["1", "/2/", "three", "5", "1s"]
let mapTest = test.map { Int($0) }
print(mapTest)
// [Optional(1), nil, nil, Optional(5), nil]
// -> nil 이 반환되더라도, 모조리 가져옴. 또한 정상적으로 변형된 값도 Optional 이 달려있음
let compactMapTest = test.compactMap { Int($0) }
print(compactMapTest)
// [1, 5]
// -> nil 은 가져오질 않음. 그리고 변형된 값도 Optional 을 벗긴 채로 가져옴.
let filterTest = test.filter { Int($0) != nil }
print(filterTest)
// ["1", "5"]
// nil 은 가져오지 않지만, Int 값으로 변경해서 가져오는 게 아니라, 필터를 통과한 원본을 반환해줌.
map의 경우 옵셔널이 씌워진 상태로 들어온다.
저 Int형 값을 사용하고싶다면 벗겨내서 사용해야한다는 번거로움이 생긴다.
반면 compactMap의 경우 nil이 아닌 경우만 배열로 반환되었기 때문에 옵셔널도 붙어있지 않다.
단순히 map으로 매핑해서 사용할 경우 옵셔널 값에 주의하고
상황에 따라서 nil일 경우가 안보이거나 필요없다면 깔끔하게 compactMap을 쓰자.
'iOS > TIL (Today I Learned)' 카테고리의 다른 글
[240329] TableViewCell & Struct & Class | TIL (0) | 2024.03.29 |
---|---|
[240328] Toss 오토레이아웃 따라하기 | TIL (0) | 2024.03.28 |
[240326] 코드로 UI 짜기 'Netflix Log-in' #2 | TIL (2) | 2024.03.26 |
[240325] To-Do List(Remaster) #2 | TIL (0) | 2024.03.25 |
[240322] CGV # 1 | TIL (1) | 2024.03.22 |