ฉันกำลังพยายามลบองค์ประกอบอาร์เรย์ทั้งหมดด้วย for loop ดังนี้:
for index 1...myArray.count {
myArray.removeAtIndex(index)
}
แต่ไม่ได้ผลฉันได้รับข้อผิดพลาดนี้ก่อนทำการ bulding:
คาดว่า ';' ในคำสั่ง 'for'
ฉันกำลังพยายามลบองค์ประกอบอาร์เรย์ทั้งหมดด้วย for loop ดังนี้:
for index 1...myArray.count {
myArray.removeAtIndex(index)
}
แต่ไม่ได้ผลฉันได้รับข้อผิดพลาดนี้ก่อนทำการ bulding:
คาดว่า ';' ในคำสั่ง 'for'
คำตอบ:
มีวิธีการ (จริง ๆ แล้วฟังก์ชั่น)
myArray.removeAll()
struct
s และโครงสร้างfunctions
ไม่เหมือนคลาสที่มีmethods
ไฟล์.
Array
s are struct
s Veteran Objective-C coder ที่นี่ ...
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
)
หากคุณต้องการล้างอาร์เรย์จริงๆวิธีที่ง่ายที่สุดคือการเริ่มต้นใหม่
รหัสของคุณควรใช้งานได้มันไม่ได้อยู่ในขอบเขต
สวิฟต์ 3
existingArray = []
โดยการทำเช่นนี้คุณจะกำหนดอาร์เรย์ว่างให้กับอาร์เรย์ที่มีอยู่อีกครั้งและชนิดข้อมูลจะถูกอ้างอิง
หรือคุณสามารถใช้removeAll
ซึ่งจะลบองค์ประกอบทั้งหมดออกจากอาร์เรย์และให้ตัวเลือกเพื่อรักษาความจุที่มีอยู่
existingArray.removeAll()
นี่คือmutating
ฟังก์ชั่นซึ่งหมายความว่าอาร์เรย์ที่เรียกเมธอดจะถูกเปลี่ยน (ว่าง)
Kyle มาถูกทางแล้ว แต่รหัสของเขาจะล้มเหลวเนื่องจากดัชนีที่เป็นไปได้ลดลงระหว่างการแจกแจงทำให้ดัชนีผิดกฎหมาย
วิธีหนึ่งในการแก้ปัญหาคือการระบุย้อนกลับ ในที่รวดเร็วนี้จะกระทำโดยใช้ความก้าวหน้า
for index in stride(from: myArray.count - 1, through: 0, by: -1) {
myArray.removeAtIndex(index)
}
ตัวเลือกอื่นที่จะใช้ filter()
Swift 1.2
myArray = filter(myArray, { (obj) -> Bool in
return false
})
สวิฟต์ 2
myArray = myArray.filter{ (obj) -> Bool in
return false
}
stride
มีวิธีremoveAllObjects () ที่มีอยู่ใน Swift 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)
}
สำหรับการลบข้อมูลทั้งหมดออกจากอาร์เรย์
yourArrayData.removeAll()
Vadian มีคำตอบที่ถูกต้องในแง่ของสิ่งที่คุณพยายามทำให้สำเร็จ ปัญหาที่แสดงเป็นผลมาจากตัวอย่างโค้ดของคุณเกิดจากวิธีที่คุณพยายามสร้างfor
ลูป Index
จะเริ่มต้นที่ 0 โดยค่าเริ่มต้น การเพิ่มช่วงตัวเลขหลังจากไม่ใช่วิธีที่ถูกต้องในการสร้าง for loop นั่นเป็นเหตุผลที่คุณเห็นข้อผิดพลาด ให้สร้าง for loop ของคุณแทนดังนี้:
for index in myArray.indices {
// Do stuff
}
หวังว่าคำตอบนี้จะช่วยให้ผู้อื่นที่ยังใหม่กับ Swift หรือการเขียนโปรแกรม
สำหรับการลบองค์ประกอบทั้งหมดของอาร์เรย์
var array = [1,2,3,4,5,6]()
array.removeAll()