programing

스위프트 배열에서 모든 영 요소를 제거하려면 어떻게 해야 합니까?

powerit 2023. 8. 16. 22:43
반응형

스위프트 배열에서 모든 영 요소를 제거하려면 어떻게 해야 합니까?

기본적인 방법은 통하지 않습니다.

for index in 0 ..< list.count {
    if list[index] == nil {
        list.removeAtIndex(index) //this will cause array index out of range
    }
}

당신의 코드의 문제는0 ..< list.count루프가 시작될 때 한 번 실행됩니다.list여전히 모든 요소를 가지고 있습니다.요소 하나를 제거할 때마다list.count는 감소하지만 반복 범위는 수정되지 않습니다.당신은 결국 너무 많이 읽게 됩니다.

Swift 4.1 이상에서는 를 사용하여 다음을 폐기할 수 있습니다.nil배열의 요소compactMap옵션이 아닌 값의 배열을 반환합니다.

let list: [Foo?] = ...
let nonNilElements = list.compactMap { $0 }

옵션 배열을 계속 사용하려면 다음을 사용할 수 있습니다.filter제거할nil요소:

list = list.filter { $0 != nil }

Swift 2.0에서는 flatMap을 사용할 수 있습니다.

list.flatMap { $0 }

이제 swift 4.2에서 사용할 수 있습니다.

list.compactMap{ $0 }

list.flatMap{ $0 }이미 사용되지 않습니다.

훨씬 우아한 해결책은 다음과 같습니다.compacted()Apple이 직접 만든 Algorithms 패키지에 정의되어 있습니다.

import Algorithms

let array = [10, nil, 20, nil, 30]
print(array.compacted()) // prints [10, 20, 30]

혜택들

  1. 간결하다.
  2. 0개 항목을 게으르게 필터링합니다.

많은 정보 https://github.com/apple/swift-algorithms/blob/main/Guides/Compacted.md

언급URL : https://stackoverflow.com/questions/31571570/how-can-i-remove-all-nil-elements-in-a-swift-array

반응형