[ios] Swift에서 열거하는 동안 배열에서 제거 하시겠습니까?
Swift의 배열을 통해 열거하고 특정 항목을 제거하고 싶습니다. 이것이 안전한지, 그렇지 않다면 어떻게해야할지 궁금합니다.
현재 나는 이것을하고있다 :
for (index, aString: String) in enumerate(array) {
//Some of the strings...
array.removeAtIndex(index)
}
답변
Swift 2에서는 enumerate
및 reverse
.
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)
이 새로운 방법에는 몇 가지 장점이 있습니다.
- .NET을 사용한 구현보다 빠릅니다
filter
. - 역전 어레이가 필요하지 않습니다.
- 제자리에서 항목을 제거하므로 새 배열을 할당하고 반환하는 대신 원래 배열을 업데이트합니다.
답변
특정 인덱스의 요소가 배열에서 제거되면 한 위치 뒤로 이동하기 때문에 모든 후속 요소의 위치 (및 인덱스)가 변경됩니다.
따라서 가장 좋은 방법은 배열을 역순으로 탐색하는 것입니다.이 경우 기존 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
}