स्विफ्ट में एक शब्दकोश के माध्यम से Iterating


222

मैं इस जवाब पर थोड़ा भ्रमित हूं कि Xcode मुझे स्विफ्ट प्रोग्रामिंग भाषा गाइड में इस प्रयोग के लिए दे रहा है:

// Use a for-in to iterate through a dictionary (experiment)

let interestingNumbers = [
    "Prime": [2, 3, 5, 7, 11, 13],
    "Fibonacci": [1, 1, 2, 3, 5, 8],
    "Square": [1, 4, 9, 16, 25]
]
var largest = 0
for (kind, numbers) in interestingNumbers {
    for number in numbers {
        if number > largest {
            largest = number
        }
    }
}
largest

मैं समझता हूँ कि के रूप में शब्दकोश transversed की जा रही है, सबसे बड़ी संख्या चर करने के लिए सेट किया जा रहा है, largest। हालाँकि, मैं इस बात को लेकर उलझन में हूँ कि Xcode क्यों कह रहा है कि largestप्रत्येक परीक्षण के आधार पर 5 बार, या 1 बार, या 3 बार सेट किया जा रहा है।

जब कोड के माध्यम से देख रहा हूं, तो मैं देखता हूं कि इसे "प्राइम" में 6 बार सेट किया जाना चाहिए (2, 3, 5, 7, 11, 13)। फिर इसे "फाइबोनैचि" में किसी भी संख्या पर छोड़ देना चाहिए क्योंकि ये सभी सबसे बड़े से कम हैं, जो वर्तमान में "प्राइम" से 13 पर सेट है। फिर, इसे 16 में सेट किया जाना चाहिए, और अंत में "स्क्वायर" में 25, कुल 8 बार उपज।

क्या मुझे पूरी तरह से कुछ याद आ रहा है?

जवाबों:


355

स्विफ्ट (और अन्य भाषाओं) में शब्दकोशों का आदेश नहीं दिया गया है। जब आप शब्दकोश के माध्यम से पुनरावृत्ति करते हैं, तो कोई ग्वारेंटी नहीं है कि आदेश आरंभीकरण क्रम से मेल खाएगा। इस उदाहरण में, स्विफ्ट "स्क्वायर" कुंजी को दूसरों से पहले संसाधित करता है। आप लूप में एक प्रिंट स्टेटमेंट जोड़कर इसे देख सकते हैं। 25 वर्ग का 5 वां तत्व है, इसलिए सबसे बड़ा वर्ग में 5 तत्वों के लिए 5 बार सेट किया जाएगा और फिर 25 पर रहेगा।

let interestingNumbers = [
    "Prime": [2, 3, 5, 7, 11, 13],
    "Fibonacci": [1, 1, 2, 3, 5, 8],
    "Square": [1, 4, 9, 16, 25]
]
var largest = 0
for (kind, numbers) in interestingNumbers {
    println("kind: \(kind)")
    for number in numbers {
        if number > largest {
            largest = number
        }
    }
}
largest

यह प्रिंट:

kind: Square
kind: Prime
kind: Fibonacci

1
आपको बहुत - बहुत धन्यवाद! मैं थोड़ी देर के लिए रुक गया था। मैं इसे जोड़ने की उम्मीद में प्रत्येक कुंजी के लिए संख्याओं को जोड़ता और हटाता रहा, लेकिन मैं कहीं नहीं जा रहा था। आपकी व्याख्या बहुत सराहना की स्पष्ट है!
निक कोहर्न

15
let dict : [String : Any] = ["FirstName" : "Maninder" , "LastName" : "Singh" , "Address" : "Chandigarh"]
dict.forEach { print($0) }

परिणाम होगा

("फर्स्टनाम", "मनिंदर") ("लास्टनेम", "सिंह") ("एड्रेस", "चंडीगढ़")


क्या आप मुझे बता सकते हैं कि क्या यह उदाहरण 1,000 डेटा लूप में अधिक कुशल है? क्योंकि मेरे पास एक JSON है जो बहुत बड़ा है, इसलिए यह अंत में मुझे 1GB प्रोसेसिंग देता है। नए उपकरण दुर्घटना नहीं करते हैं, लेकिन मेरे iPhone में 5s 16GB उस के आधे पर दुर्घटना।
डैनियल एरेन्टेस लवरडे सेप

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

12

यह एक उपयोगकर्ता-परिभाषित फ़ंक्शन है जो एक शब्दकोश के माध्यम से पुनरावृति करता है:

func findDic(dict: [String: String]){
    for (key, value) in dict{
    print("\(key) : \(value)")
  }
}

findDic(dict: ["Animal":"Lion", "Bird":"Sparrow"])
//prints Animal : Lion 
         Bird : Sparrow

11

यहाँ उस प्रयोग के लिए एक विकल्प है (स्विफ्ट 3.0)। यह आपको बताता है कि किस तरह की संख्या सबसे बड़ी थी।

let interestingNumbers = [
"Prime": [2, 3, 5, 7, 11, 13],
"Fibonacci": [1, 1, 2, 3, 5, 8],
"Square": [1, 4, 9, 16, 25],
]

var largest = 0
var whichKind: String? = nil

for (kind, numbers) in interestingNumbers {
    for number in numbers {
    if number > largest {
        whichKind = kind
        largest = number
    }
  }
}

print(whichKind)
print(largest)

OUTPUT:
Optional("Square")
25

8

यदि आप सभी मूल्यों पर पुनरावृति करना चाहते हैं:

dict.values.forEach { value in
    // print(value)
}

मुझे इस तथ्य से बहुत नफरत है, कि यह सही है। बेवकूफ जोडा में स्विफ्ट के निर्माता से बात करें हर किसी को बोलना चाहिए! Ian
सेबस्टियन

4

Arrays संग्रह का आदेश दिया है, लेकिन शब्दकोशों और सेट unordered संग्रह हैं। इस प्रकार आप एक शब्दकोश या एक सेट में पुनरावृत्ति के क्रम की भविष्यवाणी नहीं कर सकते।

संग्रह प्रकार: स्विफ्ट प्रोग्रामिंग भाषा के बारे में अधिक जानने के लिए इस लेख को पढ़ें


1

आप values.makeIterator()इस तरह से तानाशाही मूल्यों पर पुनरावृति का उपयोग कर सकते हैं :

for sb in sbItems.values.makeIterator(){
    // do something with your sb item..
    print(sb)
}

आप इस तरह से पुनरावृत्ति भी कर सकते हैं, और अधिक शैली में:

sbItems.values.makeIterator().forEach{
    // $0 is your dict value..
    print($0) 
}

* sbItemsप्रकार का तानाशाही है[String : NSManagedObject]

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