예전에도 map을 사용하면서 "index 지원 안하나?" 잠깐 생각해 본 적이 있지만,, 이번에 다익스트라 문제를 풀다가 "map을 쓸 때 element 랑 추가로 index는 동시에 사용 못 할까?" 에 해답을 찾게 되었습니다.
바로 이 함수입니다!!
평소에는 for in 구문을 통해서 배열의 첫 인덱스부터 마지막 인덱스까지 얻었습니다. map을 사용할 때는 index를 미리 선언하고 값을 증가하며 사용 했습니다. 이젠 이 함수를 사용하면 됩니다!!
EnumeratedSequence를 반환 하는데 (n,x) 이렇게 쌍을 반환합니다.
여기서 n은 0 ~ Sequence.count-1까지 index를 의미합니다. x는 Sequence의 첫 원소부터 마지막 원소까지를 의미합니다.
for (n, c) in "Swift".enumerated() {
print("\(n): '\(c)'")
}
// Prints "0: 'S'"
// Prints "1: 'w'"
// Prints "2: 'i'"
// Prints "3: 'f'"
// Prints "4: 't'"
대박..
예를들어
사과의 크기가 1~8까지 있습니다. list 배열에는 사과의 크기가 무작위로 들어가 있습니다.
list = [3,1,3,8,4]
사과의 가격은 무조건 index 0~4까지 5개 고정으로
costs = [5,7,8,2,3]
정해져 있습니다.
길다란 통이 있는데 그 통에는 크기가 4 이하인 사과만 담을 수 있습니다. 그래서 크기가 4이하인 사과를 전부 사려고 합니다. 이때의 가격 측정을 계산하는 문제가 있다고 한다고 가정하고 enumerated()를 사용해보려고 합니다.
결과는
var result = 0 에 추가할 것입니다.
1. 기본적인 for in 구문과 if 조건문 활용
for idx in 0..<list.count {
if list[idx] <= 4 {
result += costs[idx]
}
}
2. for in 구문에서 enumerated() 활용
for (idx,apple) in list.enumerated() {
if apple <= 4 {
result += costs[idx]
}
}
3. map에서 enumerated() 활용
_=list.enumerated().map{ (idx,apple) in
if list[idx] <= 4 {
result += costs[idx]
}
}
print(result)
4. map과 filter + enumerated() 활용
_=list.enumerated().filter{$0.element<=4}.map{result+=costs[$0.offset]}
print(result)
여기서 $0은 (offset, element) 를 반환하고 element는 Sequence의 원소, offset는 해당 element의 index를 반합니다.
저는 이제 map과 enumerated()를 많이 사용할 것 같습니다!!
'Swift > Deep dive!!' 카테고리의 다른 글
[Swift] where keyword. 언제 사용할 수 있는지 탐구하기!! (0) | 2023.02.16 |
---|---|
[Swift] String과 Character 자료형 개념 뿌수기(unicode scalar, grapheme cluster). Let's d (2) | 2023.01.21 |
[Swift] CustomStringConvertible Protocol 파해치기 (2) | 2022.12.30 |
[Swift] 클로저 @escaping과 @non-escaping의 생명주기, 개념과 차이 탐구 (2) | 2022.11.13 |