답변:
방법이 있습니다 (실제로는 기능)
myArray.removeAll()
struct
s이고 구조체 functions
는 methods
.
Array
s는 struct
s 라는 것을 잊었다 . 베테랑 오브젝티브 C는 ... 여기 코더
removeAll()
. 그러나 뷰가 사라질 때 불필요한 데이터를 모두 제거하는 것이 좋습니다 (메모리 규율).
@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)
}
이렇게하면 제거 된 요소가 처리 될 요소의 순서 나 색인이 변경되지 않습니다.
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 } }
바람직하게는 한 줄을 모두 사용 하지는 않지만 그 코드는 한 줄로 컴파일되어야합니다
for _ in 0...<myArray.count { myArray.removeAtIndex(0) }
? 저는 아직 효율성에 대해 잘 모르지만 이렇게하면 범위를 바꿀 필요가 없으므로 더 빠를 수 있습니다.
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)
count - 1
입니다.)
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
이 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 확장에서 사용 가능한 메소드 목록을 보여줍니다.
다음과 같이 할 수도 있습니다.
for _ in myArray
{
myArray.removeAtIndex(0)
}
Vadian은 당신이 성취하려는 것에 대한 정답을 가지고 있습니다. 코드 샘플의 결과로 표시되는 문제는 for
루프 를 생성하려는 방식 때문 입니다. Index
기본적으로 0에서 시작합니다. 다음에 숫자 범위를 추가하는 것은 for 루프를 만드는 올바른 방법이 아닙니다. 이것이 오류가 표시되는 이유입니다. 대신 다음과 같이 for 루프를 만듭니다.
for index in myArray.indices {
// Do stuff
}
바라건대,이 답변이 Swift 또는 프로그래밍을 처음 접하는 다른 사람들에게 도움이되기를 바랍니다.