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
새 배열을 반환합니다. 어레이에서 아무것도 제거하지 않습니다. filter
열거 형도 호출하지 않습니다 . 고양이 피부를 만드는 방법은 항상 여러 가지가 있습니다.
filter
방법을 고려할 수 있습니다 .
var theStrings = ["foo", "bar", "zxy"]
// Filter only strings that begins with "b"
theStrings = theStrings.filter { $0.hasPrefix("b") }
의 매개 변수 filter
는 배열 유형 인스턴스 (이 경우 String
) 를 취하고 Bool
. 결과가 true
요소를 유지하면 요소가 필터링됩니다.
filter
배열을 업데이트하지 않는 명시 적으로 만들 것입니다 , 그것은 단지 새로운 것을 반환합니다
filter
방법을 mutating
하나로 만들 수 있습니까 ( mutating
키워드를 읽었 으므로 self
대신 이와 같은 기능을 변경할 수 있음 )?
Array
mutating
에서 스위프트 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)
이 새로운 방법에는 몇 가지 장점이 있습니다.
filter
.{$0 === Class.self}
하지 작업을 수행
특정 인덱스의 요소가 배열에서 제거되면 한 위치 뒤로 이동하기 때문에 모든 후속 요소의 위치 (및 인덱스)가 변경됩니다.
따라서 가장 좋은 방법은 배열을 역순으로 탐색하는 것입니다.이 경우 기존 for 루프를 사용하는 것이 좋습니다.
for var index = array.count - 1; index >= 0; --index {
if condition {
array.removeAtIndex(index)
}
}
그러나 내 생각에 가장 좋은 접근 방법은 filter
@perlfly의 답변에서 설명한 것처럼 방법 을 사용하는 것입니다.
열거하는 동안 배열을 변경하는 것은 안전하지 않으며 코드가 충돌합니다.
몇 개의 개체 만 삭제하려면이 filter
기능을 사용할 수 있습니다 .
filter
is 와 같은 기능적 프로그래밍 함수를 사용하는 것이 더 안전 합니다. 여기 내 바보 같은 예입니다var y = [1, 2, 3, 4, 5]; print(y); for (index, value) in y.enumerated() { y.remove(at: index) } print(y)
추가하기 만하면 여러 배열이 있고 배열 A의 인덱스 N에있는 각 요소가 배열 B의 인덱스 N과 관련이있는 경우 열거 형 배열을 반대로하는 방법을 사용할 수 있습니다 (과거 답변과 같이). 그러나 다른 배열의 요소에 액세스하고 삭제할 때 되돌릴 필요가 없습니다.
Like so, (one can copy and paste this on Playground)
var a = ["a", "b", "c", "d"]
var b = [1, 2, 3, 4]
var c = ["!", "@", "#", "$"]
// remove c, 3, #
for (index, ch) in a.enumerated().reversed() {
print("CH: \(ch). INDEX: \(index) | b: \(b[index]) | c: \(c[index])")
if ch == "c" {
a.remove(at: index)
b.remove(at: index)
c.remove(at: index)
}
}
print("-----")
print(a) // ["a", "b", "d"]
print(b) // [1, 2, 4]
print(c) // ["!", "@", "$"]