Câu trả lời:
Có một phương thức (thực ra là một hàm)
myArray.removeAll()
struct
các s và cấu trúc functions
không giống như các lớp có methods
.
Array
s là struct
s. Cựu chiến binh Objective-C coder đây ...
removeAll()
. Tuy nhiên, thực hành tốt (kỷ luật bộ nhớ) là xóa tất cả dữ liệu không cần thiết khi một khung nhìn biến mất.
Dĩ nhiên rằng câu trả lời của @ vadian là giải pháp , tôi chỉ muốn chỉ ra rằng mã của bạn không hoạt động.
Trước hết, chỉ số mảng dựa trên 0, vì vậy bạn nên viết lại phạm vi cho phù hợp:
for index 0..<myArray.count {
myArray.removeAtIndex(index)
}
Tuy nhiên, việc triển khai này sẽ gây ra sự cố. Nếu bạn có một mảng 10 phần tử, phần tử cuối cùng chiếm vị trí ở chỉ số 9.
Sử dụng vòng lặp đó, ở lần lặp đầu tiên, phần tử ở chỉ mục 0 sẽ bị xóa và điều đó khiến phần tử cuối cùng chuyển xuống ở chỉ mục 8.
Ở lần lặp tiếp theo, phần tử ở chỉ mục 1 bị loại bỏ và phần tử cuối cùng chuyển xuống ở chỉ số 7. Và cứ tiếp tục như vậy.
Tại một số thời điểm trong vòng lặp, việc cố gắng xóa một phần tử cho một chỉ mục không tồn tại sẽ khiến ứng dụng gặp sự cố.
Khi xóa các phần tử khỏi một mảng trong một vòng lặp, cách tốt nhất để làm điều đó là duyệt nó theo thứ tự ngược lại:
for index in reverse(0..<myArray.count) {
myArray.removeAtIndex(index)
}
Điều đó đảm bảo rằng các phần tử bị loại bỏ không thay đổi thứ tự hoặc chỉ số của các phần tử vẫn được xử lý.
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 } }
tốt nhất là không phải tất cả một dòng nhưng mã mà nên biên dịch trên cùng một dòng
for _ in 0...<myArray.count { myArray.removeAtIndex(0) }
? Tôi chưa biết nhiều về hiệu quả, nhưng với cách này bạn không cần phải đảo ngược phạm vi, vì vậy có thể nó sẽ nhanh hơn.
Bạn đang thiếu in
từ khóa gây ra lỗi của bạn. Mã phải là:
for index in 1...myArray.count {
myArray.removeAtIndex(index)
}
Tuy nhiên, điều này sẽ không hoạt động như bạn mong đợi vì một số lý do:
count - 1
sẽ yêu cầu1..<myArray.count
Nếu bạn đang cố gắng xóa tất cả mọi thứ khỏi mảng thì bạn nên làm như những người khác đã đề xuất và sử dụng:
myArray.removeAll()
Trong trường hợp bạn chỉ muốn phần tử đầu tiên và không có gì khác, bạn có thể lấy tham chiếu đến đối tượng đầu tiên, hãy làm trống mảng, sau đó thêm đối tượng trở lại:
var firstElement = myArray.first!
myArray.removeAll()
myArray.append(firstElement)
count - 1
).
Mã của bạn sẽ hoạt động, nó không bị ràng buộc.
Swift 3
existingArray = []
Bằng cách này, bạn gán lại một mảng trống cho mảng hiện có và kiểu dữ liệu được tham chiếu.
Ngoài ra, bạn có thể sử dụng tính năng removeAll
này xóa tất cả các phần tử khỏi mảng và cung cấp tùy chọn để giữ dung lượng hiện có.
existingArray.removeAll()
Đây là một mutating
hàm có nghĩa là mảng gọi phương thức sẽ bị thay đổi (trống).
Kyle đang đi đúng hướng, nhưng mã của anh ta sẽ thất bại vì các chỉ số có thể giảm trong quá trình liệt kê, dẫn đến các chỉ số bất hợp pháp.
Một cách để giải quyết nó là liệt kê ngược. Nhanh chóng điều này được thực hiện bằng cách sử dụng các bước .
for index in stride(from: myArray.count - 1, through: 0, by: -1) {
myArray.removeAtIndex(index)
}
các tùy chọn khác sẽ được sử dụng filter()
Swift 1.2
myArray = filter(myArray, { (obj) -> Bool in
return false
})
Swift 2
myArray = myArray.filter{ (obj) -> Bool in
return false
}
stride
Có phương thức removeAllObjects () có sẵn trong Swift 2
Syntax : public func removeAllObjects()
Eg.: mainArray.removeAllObjects
Để xóa phần tử tại chỉ mục cụ thể, hãy sử dụng:
Syntax : public func removeObjectAtIndex(index: Int)
Eg.: mainArray.removeObjectAtIndex(5)
Để loại bỏ việc sử dụng phần tử cuối cùng:
Syntax : public func removeLastObject()
Eg.: mainArray.removeLastObject()
Để xóa các phần tử trong phạm vi cụ thể, hãy sử dụng:
Syntax : public func removeObject(anObject: AnyObject, inRange range: NSRange)
Để loại bỏ việc sử dụng phần tử cụ thể:
Syntax : public func removeObject(anObject: AnyObject)
Ảnh chụp màn hình bên dưới hiển thị danh sách phương pháp có sẵn trong phần mở rộng NSMutableArray
Bạn cũng có thể làm điều này:
for _ in myArray
{
myArray.removeAtIndex(0)
}
Vadian có câu trả lời chính xác về những gì bạn đang cố gắng hoàn thành. Sự cố được hiển thị do mẫu mã của bạn là do cách bạn đang cố gắng tạo for
vòng lặp. Index
sẽ bắt đầu từ 0 theo mặc định. Thêm vào một dải số sau nó không phải là cách chính xác để tạo vòng lặp for. Đó là lý do tại sao bạn gặp lỗi. Thay vào đó, hãy tạo vòng lặp for của bạn như sau:
for index in myArray.indices {
// Do stuff
}
Hy vọng rằng câu trả lời này sẽ giúp ích cho những người mới làm quen với Swift hoặc lập trình.
Để xóa tất cả các phần tử của mảng
var array = [1,2,3,4,5,6]()
array.removeAll()