2016-06-02 9 views
30

तो, मैं एक के लिए पाश है कि इस के समान लगता है की है। लेकिन जब मैंने उसे पसंद किया स्विफ्ट 3.0 वाक्य रचना करने के लिए बदल:मैं लूप के दौरान संशोधित एक सरणी के लिए स्विफ्ट 3 में फ़ॉर-लूप कैसे लिखूं?</p> <pre><code>for var i = 0; i < results.count ; i += 1 { if (results[i] < 5) { results.removeAtIndex(i) i -= 1 } } </code></pre> <p>यह काम करता था:

for var i in 0..<results.count { 
    if (results[i] < 5) { 
     results.removeAtIndex(i) 
     i -= 1 
    } 
} 

मैं एक सरणी IOOBE अपवाद गिनती, क्योंकि यह नहीं है फिर से जांचें और मूल results.count तक पर जारी है।

मैं इसे कैसे ठीक करूं? यह अब काम करता है, लेकिन मैं भविष्य में परेशानी नहीं लेना चाहता हूं।

+0

इस कोड को शिकायत नहीं है 0 में वर मैं ..

+0

यह समझ में नहीं आता है कि सेब ने लूप को इतनी जटिल क्यों बनाया है, मुझे पिछले 25 वर्षों के लिए कोई समस्या नहीं है –

उत्तर

50

जबकि filter के समाधान बनाने उपयोग एक अच्छा समाधान है और यह अधिक है स्विफ्ट-ly, वहाँ एक और तरीका है, अगर for-in का इस्तेमाल कर रही है, फिर भी, अभी भी वांछित:

var results = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10] 

for var i in (0..<results.count).reverse() 
{ 
    if (results[i] < 5) 
    { 
     results.removeAtIndex(i) 
     //i -= 1 
    } 
} 

print(results) 

परिणाम:

[5, 6, 7, 8, 9, 10] 

हम इसके अलावा में कुल मिलाकर इस लाइन i -= 1 छोड़ सकता है।

removeAtIndex पाश के भीतर के साथ समस्या यह है कि यह पुनः अनुक्रमित सरणी ही यथा-स्थान और इस तरह सीमा अपवाद से बाहर एक सरणी के कारण count अद्यतन नहीं होने के कारण का कारण नहीं होगा।

पीछे की तरफ घुमाकर, सीमा अपवाद से बाहर इस प्रकार से बचा जा सकता है।

+1

हे भगवान ... यह वास्तव में स्मार्ट है।हाँ मुझे पता है कि फिल्टर तरीका अधिक तेज़ * होगा * लेकिन मुझे लगता है कि इस तरह इसका उपयोग करने के लिए बेहतर तरीके से लागू होता है। धन्यवाद! – QuantumHoneybees

+0

हुरे, एक ओपी का एक संपादक जो वास्तव में एक अच्छी तरह से प्राप्त उत्तर प्रदान करता है, न सिर्फ प्रतिनिधि को बढ़ाने के लिए संपादन। दुर्लभ। – aremvee

+0

@Uheheiling - .reverse() यह फ़ंक्शन swift3 में समर्थित नहीं है। कोई भी एक ही प्रश्न पर और मदद कर सकता है? –

14

क्या आप इसके बजाय filter का उपयोग कर सकते हैं?

let numbers = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10] 
let greaterThan5 = numbers.filter{$0 >= 5} 
print(greaterThan5) 
+0

आह हाँ, आप सही हैं! मैं संशोधित करूंगा, धन्यवाद! –

+0

नई सरणी को 'bigThan4' नाम दिया जाना चाहिए;) वैसे भी समस्या को हल करने का यह सही तरीका है। –

+0

ओह हाँ सही! जो फ़ंक्शन इसे कॉल करता है उसे "फ़िल्टरअरे" कहा जाता है। मैंने कनेक्शन कभी नहीं बनाया है। लेकिन मुझे अंत में जोड़ने के लिए फ़िल्टर किए गए परिणामों की भी आवश्यकता है। कोई सुझाव? – QuantumHoneybees

10

आप एक for -loop उपयोग जारी रखना चाहते हैं, तो आप दोनों सूचकांक और तत्व enumerate का उपयोग करने पर गणना कर सकते हैं:

for (index, element) in results.enumerate() { 
    if (element < 5) { 
    results.removeAtIndex(index) 
    } 
} 

यद्यपि आप अपने पाश में क्या कर रहे हैं पर निर्भर करता है, filter विधि एक बेहतर विचार हो सकता है।

+7

यह एक बुरा विचार है, आप कुछ परिस्थितियों में बाहर की श्रेणी के जाल में भाग लेंगे, उदाहरण के लिए सरणी '[6, 5, 4, 3, 2, 1]' का प्रयास करें। कारण यह है कि सरणी लूप में संशोधित है लेकिन सूचकांक समायोजित नहीं है। – vadian

0

अपने पाश आगे चला जाता है ...

for var i in (0..<results.count) where results.indices.contains(i) { 

//if the index doesn't exist, the loop will be stopped. 

if (results[i] < 5) { 
     results.removeAtIndex(i) 
    } 

} 
संबंधित मुद्दे