जवाबों:
एक विधि है (वास्तव में एक कार्य)
myArray.removeAll()
struct
और functions
जो वर्गों के विपरीत हैं methods
।
Array
s s हैं struct
। वयोवृद्ध ऑब्जेक्टिव-सी यहाँ सांकेतिक शब्दों में बदलनेवाला ...
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
फ़ंक्शन है जिसका मतलब है कि विधि को कॉल करने वाले सरणी को बदल दिया जाएगा (खाली)।
काइल सही रास्ते पर है, लेकिन उसका कोड विफल हो जाएगा क्योंकि गणना करने के दौरान संभावित सूचकांक कम हो जाते हैं, जिससे अवैध सूचकांकों का सामना करना पड़ता है।
इसे हल करने का एक तरीका पीछे की ओर ले जाना है। स्विफ्ट में यह स्ट्राइड्स का उपयोग करके किया जाता है ।
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)
}
आप जो हासिल करने की कोशिश कर रहे हैं, उसके संदर्भ में वाडियन का सही जवाब है। जिस तरह से आप for
लूप बनाने की कोशिश कर रहे हैं उसके कारण आपके कोड नमूने के परिणामस्वरूप दिखाया गया मुद्दा है । Index
डिफ़ॉल्ट रूप से 0 से शुरू होगा। लूप बनाने के लिए सही तरीका नहीं होने के बाद एक संख्या सीमा में जोड़ना। इसलिए आप त्रुटि देख रहे हैं। इसके बजाय, लूप के लिए अपना निर्माण निम्नानुसार करें:
for index in myArray.indices {
// Do stuff
}
उम्मीद है, इस उत्तर से उन लोगों को मदद मिलेगी जो स्विफ्ट या प्रोग्रामिंग में नए हैं।
ऐरे के सभी तत्वों को हटाने के लिए
var array = [1,2,3,4,5,6]()
array.removeAll()