समझने के लिए क्यों i
म्यूटेबल नहीं हो सकता है यह जानने के लिए कि for…in
क्या है। for i in 0..<10
निम्न के संकलक द्वारा विस्तार किया जाता है:
var g = (0..<10).generate()
while let i = g.next() {
// use i
}
पाश के आसपास हर बार, i
एक ताजी घोषित चर, जनरेटर पर next
कॉल करने से अगले परिणाम unwrapping का मूल्य है।
अब, यह while
इस तरह लिखा जा सकता है:
while var i = g.next() {
// here you _can_ increment i:
if i == 5 { ++i }
}
लेकिन निश्चित रूप से, यह मदद नहीं होगा - g.next()
अभी भी पाश के आसपास एक 5 अगली बार उत्पन्न करने के लिए जा रहा है। शरीर में वृद्धि व्यर्थ थी।
संभावित रूप से इस कारण से for…in
उसी लूप काउंटर को घोषित करने के लिए उसी var
वाक्यविन्यास का समर्थन नहीं करता है - अगर आपको यह नहीं पता था कि यह कैसे काम करता है तो यह बहुत भ्रमित होगा।
(where
के विपरीत, जहां आप देख सकते हैं कि क्या हो रहा है - var
कार्यक्षमता कभी-कभी उपयोगी होती है, इसी प्रकार func f(var i)
कैसे हो सकता है)।
// iterate over every other integer
for i in 0.stride(to: 10, by: 2) { print(i) }
// skip a specific number
for i in (0..<10).filter({ $0 != 5 }) { print(i) }
let a = ["one","two","three","four"]
// ok so this one’s a bit convoluted...
let everyOther = a.enumerate().filter { $0.0 % 2 == 0 }.map { $0.1 }.lazy
for s in everyOther {
print(s)
}
स्रोत
2015-01-31 12:21:07
संशोधित करना:
क्या आप चाहते हैं (सी-शैली
for
याwhile
का सहारा के बिना) पाश, अपने बेहतर शर्त के कुछ पुनरावृत्तियों को छोड़ने के लिए है, तो एक जनरेटर है कि प्रासंगिक मूल्यों को छोड़ देता है उपयोग करने के लिए है 'for' के इटरेटर को आमतौर पर खराब कोड माना जाता है। 'इन' के लिए कोई पुनरावर्तक नहीं है, 'संख्या' एक पुनरावर्तक नहीं है। इसका मूल्य लूप को किसी भी तरह से प्रभावित नहीं करता है। – Sulthan