티스토리 뷰

반응형

 

 

 


Slice
컬렉션 조각

컬렉션 조각, Slice 또한 제네릭 구조체로 선언되어있습니다. 선언부에서 볼 수 있듯이, 원본 컬렉션의 타입을 따라가게 됩니다. Slice는 이름 그대로, 원본 컬렉션의 부분 배열이라 할 수 있을 것 같습니다. 컬렉션 프로토콜도 그렇듯, 이를 준수하는 Sllice는 스위프트 표준 라이브러리에 포함되어 있습니다.

 

 


Slices Share Indices 
기존 색인을 공유하는 부분 컬렉션

컬렉션과 그 컬렉션의 부분 조각(Slices)은 동일한 색인, 인덱스 값을 공유합니다.
Collection의 요소는 컬렉션 내 부분 조각(Slices)에도 동일하게 공유됩니다. 부분 조각 혹은 원본 컬렉션이 생성된 이후 변경되지 않았다면 말이죠.

 

그 예를 들자면, 세션 간 각 클래스의 결석 수를 고정적으로 기록한다고 가정해봅니다. 

var absences = [0, 2, 0, 4, 0, 3, 1, 0]

당신은 이때 하반기 세션 간 가장 많은 결석 수가 있던 날을 찾고자 합니다. 이를 계산하고자 한다면 다음과 같은 단계를 밟을 수 있습니다.

1. 하반기의 기록을 갖고 있는 absences 배열의 조각(Slice)를 생성한다. 
2. max(by:) 메서드를 사용해서 어떤 날이 가장 많은 결석 수를 기록했는지 알아낸다.
3. step2. 에서 구한 결과를 토대로 얻은 인덱스 값을 원본 absences 배열에 접근하여 가장 많은 결석날을 출력한다. 

이렇게 3단계가 될 수 있습니다. 그렇다면 이제 실제 코드로 구현해보겠습니다. 

 

var absences = [0, 2, 0, 4, 0, 3, 1, 0]

// abseonces 원본 배열로부터 하반기의 결석 기록을 분리해서 얻어옵니다.
let secondHalf = absences.suffix(absences.count / 2)

// 결석 수가 가장 높은 날인 경우의 인덱스 값이 존재한다면 index에 저장 후, absences[index] 값을 결과로 출력합니다.
if let index = secondHalf.indices.max(by: { secondHalf[$0] < secondHalf[$1] }) {
    print("The Highest second-half absences: \(absences[index])")
}

먼저, absences라는 컬렉션 프로토콜을 준수하는 [Int] 배열을 선언했습니다. 이후의 과정을 설명해 보겠습니다.

1) 우리는 하반기의 최대 결석 횟수를 얻으려 하기 때문에 absences.suffix(absences.count / 2)를 통해 뒤에서 절반의 컬렉션 조각을 secondHalf에 저장합니다. 
2) 얻어낸 절반의 컬렉션 조각, secondHalf의 색인 범위를 indices를 통해 얻습니다. 이어서 max(by:) 메서드를 통해 해당 범위내 가장 최대의 결석일을 계산하여 그 값이 존재하면 absences[index]로 출력하고 있습니다. 

 

 


이처럼 원본 컬렉션의 일부 범위를 갖고 있는 조각 값, secondHalf를 통해 얻은 최댓값 인덱스를 absences 원본 컬렉션에 접근하여 하반기 최대 결석일을 구할 수 있는 것은 -> "원본 컬렉션과 조각이 서로 같은 색인을 공유하고 있기 때문"이라고 할 수 있겠습니다. 🤗

 

 

 
반응형
댓글
반응형
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/05   »
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 31
글 보관함