[ios] Swift에서 열거하는 동안 배열에서 제거 하시겠습니까?

Swift의 배열을 통해 열거하고 특정 항목을 제거하고 싶습니다. 이것이 안전한지, 그렇지 않다면 어떻게해야할지 궁금합니다.

현재 나는 이것을하고있다 :

for (index, aString: String) in enumerate(array) {
    //Some of the strings...
    array.removeAtIndex(index)
}



답변

Swift 2에서는 enumeratereverse.

var a = [1,2,3,4,5,6]
for (i,num) in a.enumerate().reverse() {
    a.removeAtIndex(i)
}
print(a)


답변

filter방법을 고려할 수 있습니다 .

var theStrings = ["foo", "bar", "zxy"]

// Filter only strings that begins with "b"
theStrings = theStrings.filter { $0.hasPrefix("b") }

의 매개 변수 filter는 배열 유형 인스턴스 (이 경우 String) 를 취하고 Bool. 결과가 true요소를 유지하면 요소가 필터링됩니다.


답변

에서 스위프트 3, 4 ,이 될 것이다 :

Johnston의 대답에 따르면 숫자로 :

var a = [1,2,3,4,5,6]
for (i,num) in a.enumerated().reversed() {
   a.remove(at: i)
}
print(a)

OP의 질문으로 문자열 사용 :

var b = ["a", "b", "c", "d", "e", "f"]

for (i,str) in b.enumerated().reversed()
{
    if str == "c"
    {
        b.remove(at: i)
    }
}
print(b)

그러나 이제 Swift 4.2 이상 에서는 WWDC2018에서 Apple이 권장 한 더 좋고 빠른 방법 이 있습니다.

var c = ["a", "b", "c", "d", "e", "f"]
c.removeAll(where: {$0 == "c"})
print(c)

이 새로운 방법에는 몇 가지 장점이 있습니다.

  1. .NET을 사용한 구현보다 빠릅니다 filter.
  2. 역전 어레이가 필요하지 않습니다.
  3. 제자리에서 항목을 제거하므로 새 배열을 할당하고 반환하는 대신 원래 배열을 업데이트합니다.


답변

특정 인덱스의 요소가 배열에서 제거되면 한 위치 뒤로 이동하기 때문에 모든 후속 요소의 위치 (및 인덱스)가 변경됩니다.

따라서 가장 좋은 방법은 배열을 역순으로 탐색하는 것입니다.이 경우 기존 for 루프를 사용하는 것이 좋습니다.

for var index = array.count - 1; index >= 0; --index {
    if condition {
        array.removeAtIndex(index)
    }
}

그러나 내 생각에 가장 좋은 접근 방법은 filter@perlfly의 답변에서 설명한 것처럼 방법 을 사용하는 것입니다.


답변

열거하는 동안 배열을 변경하는 것은 안전하지 않으며 코드가 충돌합니다.

몇 개의 개체 만 삭제하려면이 filter기능을 사용할 수 있습니다 .


답변

삭제할 항목을 저장하기 위해 변경 가능한 배열을 만든 다음 열거 후 해당 항목을 원본에서 제거합니다. 또는 배열의 복사본 (불변)을 만들고 열거하고 열거하는 동안 원본에서 개체 (인덱스별로 아님)를 제거합니다.


답변

기존의 for 루프는 간단한 while 루프로 대체 될 수 있으며, 제거하기 전에 각 요소에 대해 다른 작업을 수행해야하는 경우에도 유용합니다.

var index = array.count-1
while index >= 0 {

     let element = array[index]
     //any operations on element
     array.remove(at: index)

     index -= 1
}