Swift : 모든 배열 요소 삭제


108

다음과 같이 for 루프를 사용하여 모든 배열 요소를 삭제하려고합니다.

for index 1...myArray.count {
   myArray.removeAtIndex(index)
}

하지만 작동하지 않습니다. bulding 전에이 오류가 발생합니다.

';'가 필요합니다. 'for'문에서


5
단순한. 어레이 다시 초기화 ...
VJ

답변:


326

방법이 있습니다 (실제로는 기능)

myArray.removeAll()

1
이것에 대해 몰랐습니다, 감사합니다 +1
JamesG

11
@NoodleOfDeath 엄밀히 말하면 Swift 배열은 structs이고 구조체 functionsmethods.
vadian

1
설명을 위해 @vadian +1. 나는 Arrays는 structs 라는 것을 잊었다 . 베테랑 오브젝티브 C는 ... 여기 코더
NoodleOfDeath

1
초기화하는 뷰 (viewcontroller)를 종료 할 때 removeAll () 함수를 호출해야합니까, 아니면 저절로 사라지나요!?
Famic Tech

1
@FamicTech 그것은 의존합니다 : 뷰가 언로드되면 암시 적으로 사라지고 뷰가 사라지기만하면을 호출해야합니다 removeAll(). 그러나 뷰가 사라질 때 불필요한 데이터를 모두 제거하는 것이 좋습니다 (메모리 규율).
vadian

17

@vadian의 대답 이 해결책 이라는 것을 당연하게 생각하면 코드가 작동하지 않는다는 점을 지적하고 싶습니다.

우선 배열 인덱스는 0부터 시작하므로 그에 따라 범위를 다시 작성해야합니다.

for index 0..<myArray.count {
   myArray.removeAtIndex(index)
}

그러나이 구현은 충돌을 일으킬 것입니다. 10 개 요소의 배열이있는 경우 마지막 요소는 인덱스 9의 위치를 ​​차지합니다.

이 루프를 사용하면 첫 번째 반복에서 인덱스 0의 요소가 제거되고 마지막 요소가 인덱스 8에서 아래로 이동합니다.

다음 반복에서 인덱스 1의 요소가 제거되고 마지막 요소는 인덱스 7에서 아래로 이동합니다.

루프의 어느 시점에서 존재하지 않는 인덱스에 대한 요소를 제거하려고하면 앱이 중단됩니다.

루프의 배열에서 요소를 제거 할 때 가장 좋은 방법은 역순으로 순회하는 것입니다.

for index in reverse(0..<myArray.count) {
    myArray.removeAtIndex(index)
}

이렇게하면 제거 된 요소가 처리 될 요소의 순서 나 색인이 변경되지 않습니다.


1
한 줄로 모든 요소를 ​​제거하는 기능이 있습니다. @의 vadian의 대답 ... 등
VJ

3
@VJ 그게 내가 내 대답의 첫 번째 줄에 쓴 것입니다 :)
Antonio

개체의 특정 인스턴스를 제거하는 데 사용할 수있는 솔루션의 경우 +1입니다. 나는 public extension Array where Element : Equatable { public mutating func remove(element: Element) -> Int { var occurrences = 0; for index in (0 ..< count).reverse() { if self[index] == element { removeAtIndex(index); occurrences += 1 } }; return occurrences } }바람직하게는 한 줄을 모두 사용 하지는 않지만 그 코드는 한 줄로 컴파일되어야합니다
NoodleOfDeath

왜 안돼 for _ in 0...<myArray.count { myArray.removeAtIndex(0) }? 저는 아직 효율성에 대해 잘 모르지만 이렇게하면 범위를 바꿀 필요가 없으므로 더 빠를 수 있습니다.
cbjeukendrup

그것도 작동합니다! 효율성 측면에서 동일한 방법으로 끝 대신 처음부터 제거하지만 변수를 저장합니다. :-)
Antonio

7

in오류를 일으키는 키워드 가 없습니다 . 코드는 다음과 같아야합니다.

for index in 1...myArray.count {
    myArray.removeAtIndex(index)
}

그러나 다음과 같은 몇 가지 이유로 예상대로 작동하지 않습니다.

  • 마지막으로 유효한 지수는 count - 1요구되는1..<myArray.count
  • 더 중요한 것은 배열에서 요소를 제거하면 길이가 줄어들어 매번 인덱스가 변경됩니다.

배열에서 모든 것을 제거하려는 경우 다른 사람들이 제안하고 사용하는대로 수행해야합니다.

myArray.removeAll()

첫 번째 요소 만 원하는 경우 첫 번째 개체에 대한 참조를 가져올 수있는 경우 배열을 비운 다음 개체를 다시 추가합니다.

var firstElement = myArray.first!
myArray.removeAll()
myArray.append(firstElement)

미안 해요 ... "에서"보지 않았다 했나 +1
VJ

1
(+1) 실제 오류를 설명합니다. (-1) 항목을 삭제하면 배열이 짧아 지므로 작동하지 않기 때문입니다. ( 마지막 유효한 색인은 count - 1입니다.)
Martin R

7

정말로 어레이를 지우고 싶다면 가장 간단한 방법은 다시 초기화하는 것입니다.


3

코드가 작동해야하며 범위를 벗어났습니다.

스위프트 3

existingArray = []

이렇게하면 기존 배열에 빈 배열을 다시 할당하고 데이터 유형이 참조됩니다.

또는 removeAll어레이에서 모든 요소를 ​​제거하고 기존 용량을 유지하는 옵션을 제공하는 방법을 사용할 수 있습니다.

existingArray.removeAll()

mutating메서드를 호출하는 배열이 변경 (비어 있음)을 의미 하는 함수입니다.


2

Kyle은 올바른 길을 가고 있지만 열거하는 동안 가능한 인덱스가 줄어들어 불법 인덱스로 이어 지므로 코드가 실패합니다.

그것을 해결하는 한 가지 방법은 거꾸로 열거하는 것입니다. 신속하게 이것은 strides 를 사용하여 수행됩니다 .

for index in stride(from: myArray.count - 1, through: 0, by: -1) {
    myArray.removeAtIndex(index)
}

다른 옵션은 사용하는 것입니다 filter()

스위프트 1.2

myArray = filter(myArray, { (obj) -> Bool in
    return false
})

스위프트 2

myArray = myArray.filter{ (obj) -> Bool in
    return false
}

매우 흥미로운! 내가 알고하지 않았다stride
카일 Decot

1

removeAllObjects () 스위프트 2에서 사용할 수있는 방법은

Syntax :  public func removeAllObjects()
Eg.:   mainArray.removeAllObjects

특정 인덱스에서 요소를 제거하려면 다음을 사용하십시오.

Syntax : public func removeObjectAtIndex(index: Int)
Eg.: mainArray.removeObjectAtIndex(5)

마지막 요소 사용을 제거하려면 다음을 수행하십시오.

Syntax : public func removeLastObject()
Eg.: mainArray.removeLastObject()

특정 범위의 요소를 제거하려면 다음을 사용하십시오.

Syntax : public func removeObject(anObject: AnyObject, inRange range: NSRange)

특정 요소 사용을 제거하려면 다음을 수행하십시오.

Syntax : public func removeObject(anObject: AnyObject)

아래 스크린 샷은 NSMutableArray 확장에서 사용 가능한 메소드 목록을 보여줍니다.

스크린 샷 1


0

다음과 같이 할 수도 있습니다.

for _ in myArray
{
    myArray.removeAtIndex(0)
}

2
이 솔루션은 매우 비효율적입니다. 각 반복에서 모든 후속 개체 인덱스가 이동됩니다. 또한이 구현이 안전한지 확실하지 않습니다. 열거 중 적어도 Objective-C 컬렉션에서 변형은 금지됩니다.
Borys Verebskyi

0

배열에서 모든 데이터를 제거하기 위해

yourArrayData.removeAll()


0

Vadian은 당신이 성취하려는 것에 대한 정답을 가지고 있습니다. 코드 샘플의 결과로 표시되는 문제는 for루프 를 생성하려는 방식 때문 입니다. Index기본적으로 0에서 시작합니다. 다음에 숫자 범위를 추가하는 것은 for 루프를 만드는 올바른 방법이 아닙니다. 이것이 오류가 표시되는 이유입니다. 대신 다음과 같이 for 루프를 만듭니다.

for index in myArray.indices {
    // Do stuff
}

바라건대,이 답변이 Swift 또는 프로그래밍을 처음 접하는 다른 사람들에게 도움이되기를 바랍니다.


컬렉션을 반복 할 때 배열 인덱스 속성을 사용해야합니다. 모든 컬렉션이 제로 인덱스에서 시작하는 것은 아닙니다
Leo Dabus

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.