स्विफ्ट: सभी ऐरे तत्वों को हटा दें


108

मैं इस तरह से एक लूप के साथ सभी सरणी तत्वों को हटाने की कोशिश कर रहा हूं:

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

लेकिन यह काम नहीं करता है, मुझे यह त्रुटि उभड़ने से पहले मिलती है:

अपेक्षित होना ';' 'फॉर' स्टेटमेंट


5
सरल। सरणी को पुनः आरंभ करें ...
वीजे

जवाबों:


326

एक विधि है (वास्तव में एक कार्य)

myArray.removeAll()

1
इसके बारे में नहीं पता था,
थैंक्स

11
@NoodleOfDeath कड़ाई से बोली जाने वाली स्विफ्ट सरणियां हैं structऔर functionsजो वर्गों के विपरीत हैं methods
११:१३ बजे वादी

1
स्पष्टीकरण के लिए @vadian +1। मैं भूल गया Arrays s हैं struct। वयोवृद्ध ऑब्जेक्टिव-सी यहाँ सांकेतिक शब्दों में बदलनेवाला ...
NoodleOfDeath

1
क्या आपको किसी दृश्य (व्यू कंट्रौलर) से बाहर निकलते समय निष्कासन () फ़ंक्शन को कॉल करने की आवश्यकता है जहां आप इसे इनिशियलाइज़ करते हैं, या क्या यह अपने आप दूर हो जाता है !?
फेमिक टेक

1
@ फ़ेमटेक यह निर्भर करता है: यदि दृश्य अनलोड किया गया है तो यह अंतर्निहित रूप से दूर हो जाता है, यदि दृश्य केवल गायब हो जाता है तो आपको कॉल करना होगा removeAll()। हालाँकि जब दृश्य गायब हो जाता है तो सभी अनावश्यक डेटा को हटाने के लिए यह अच्छा (मेमोरी अनुशासन) अभ्यास है।
११:

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
केवल एक लाइन में सभी तत्वों को निकालने के लिए एक फ़ंक्शन है। as @ vadian का जवाब ...
VJ

3
@ वीजे यही मैंने अपने उत्तर की पहली पंक्ति में लिखा है :)
एंटोनियो

एक समाधान के लिए +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

वह भी काम करता है! दक्षता के संदर्भ में समान विधि, आप अंत के बजाय शुरुआत से हटा देते हैं, लेकिन आप एक चर को बचाते हैं :-)
एंटोनियो

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
(+1) वास्तविक त्रुटि की व्याख्या के लिए। (-1) क्योंकि यह काम नहीं करेगा, क्योंकि किसी आइटम को हटाने से सरणी छोटी हो जाती है। (यह भी ध्यान दें कि अंतिम वैध सूचकांक है count - 1)।
मार्टिन आर।

7

यदि आप वास्तव में सरणी को साफ़ करना चाहते हैं, तो सबसे सरल तरीका यह है कि इसे पुनः आरंभ करें।


3

आपका कोड काम करना चाहिए, यह केवल बाध्य है।

स्विफ्ट 3

existingArray = []

ऐसा करने से आप मौजूदा सरणी के लिए एक खाली सरणी फिर से असाइन करते हैं और डेटा प्रकार को संदर्भित किया जाता है।

वैकल्पिक रूप से, आप उपयोग कर सकते हैं removeAllजो सरणी से सभी तत्वों को निकालता है और मौजूदा क्षमता रखने के लिए एक विकल्प प्रदान करता है।

existingArray.removeAll()

यह एक mutatingफ़ंक्शन है जिसका मतलब है कि विधि को कॉल करने वाले सरणी को बदल दिया जाएगा (खाली)।


2

काइल सही रास्ते पर है, लेकिन उसका कोड विफल हो जाएगा क्योंकि गणना करने के दौरान संभावित सूचकांक कम हो जाते हैं, जिससे अवैध सूचकांकों का सामना करना पड़ता है।

इसे हल करने का एक तरीका पीछे की ओर ले जाना है। स्विफ्ट में यह स्ट्राइड्स का उपयोग करके किया जाता है ।

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
काइल डिकोट

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
यह समाधान भयानक रूप से अक्षम है - प्रत्येक पुनरावृत्ति पर सभी बाद की वस्तुओं के सूचकांक को स्थानांतरित कर दिया जाता है। इसके अलावा, मुझे यकीन नहीं है कि यह कार्यान्वयन सुरक्षित है। कम से कम उद्देश्य-सी संग्रह में उत्परिवर्तन के दौरान उत्परिवर्तन निषिद्ध है।
बोरिज़ वेरेबस्की

0

एक सरणी से सभी डेटा को हटाने के लिए

yourArrayData.removeAll()


0

आप जो हासिल करने की कोशिश कर रहे हैं, उसके संदर्भ में वाडियन का सही जवाब है। जिस तरह से आप forलूप बनाने की कोशिश कर रहे हैं उसके कारण आपके कोड नमूने के परिणामस्वरूप दिखाया गया मुद्दा है । Indexडिफ़ॉल्ट रूप से 0 से शुरू होगा। लूप बनाने के लिए सही तरीका नहीं होने के बाद एक संख्या सीमा में जोड़ना। इसलिए आप त्रुटि देख रहे हैं। इसके बजाय, लूप के लिए अपना निर्माण निम्नानुसार करें:

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

उम्मीद है, इस उत्तर से उन लोगों को मदद मिलेगी जो स्विफ्ट या प्रोग्रामिंग में नए हैं।


संग्रह को पुनरावृत्त करते समय आपको सरणी सूचक गुण का उपयोग करना चाहिए। सभी संग्रह शून्य सूचकांक से शुरू नहीं होते हैं
लियो डबस

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.