2015-07-27 6 views
21

मैं वस्तुओंस्विफ्ट में वस्तुओं की सरणी के माध्यम से कैसे पुनरावृत्त करें?

var person1 = Person() 
person1.name = "Joe" 
person1.lastName = "Doe" 
person1.age = 21 

var person2 = Person() 
person2.name = "Julia" 
person2.lastName = "Ivanova" 
person2.age = 22 

var person3 = Person() 
person3.name = "Irina" 
person3.lastName = "Petrova" 
person3.age = 25 

var person9 = Person() 
person9.name = "Vova" 
person9.lastName = "Vovin" 
person9.age = 32 

var person10 = Person() 
person10.name = "Masha" 
person10.lastName = "Golovanova" 
person10.age = 20 

var person11 = Person() 
person11.name = "Petra" 
person11.lastName = "Andreeva" 
person11.age = 27 

और बहु ​​सरणी

var array = [[person1, person2, person3], [person9, person10, person11]] 

मैं सरणी के माध्यम से कैसे पुनरावृति कर सकते हैं नाम = "माशा" के साथ एक व्यक्ति उदाहरण के लिए प्राप्त करने के लिए पहले से

धन्यवाद

+0

की संभावित डुप्लिकेट [कैसे तेज में वस्तुओं की एक सरणी के माध्यम से लूप करने के लिए] (http: //stackoverflow.com/questions/30596021/how-to-loop-through-an-array-of-objects-in-swift) –

उत्तर

40

मैं यह कोशिश करूंगा:

var array:[[Person]] = [[person1, person2, person3], [person9, person10, person11]] 
/*Casting it like this should keep from getting an error later 
    and/or having to recast the objects*/ 

for people in array { 

/*This is going to look at each array in arrays, 
    and call each one 'people' within this loop*/ 

    for person in people { 

    /*Same thing, this is going to look at each item in the people array 
     and call each one 'person' within this loop*/ 

     if person.name == "Masha" { 
      return person 
     } 
    } 
} 
9

आईरेटिंग @ राहेल के जवाब में किया जा सकता है। हालांकि, वही काम करने के विभिन्न तरीके हैं, और जरूरी नहीं है - और कुछ मामलों में कोड की केवल एक पंक्ति के साथ।

यदि आप खोजना चाहते हैं, तो सबसे अच्छा तरीका सरणी की filter विधि का उपयोग कर रहा है - लेकिन इससे पहले flatMap का उपयोग करके बहु आयामी सरणी को फ़्लैटन किया जाना चाहिए।

तो, पहला तत्व एक निश्चित नाम होने लगता है, तो आप बस कर सकते हैं:

let result: Person? = array.flatMap { $0 }.filter { $0.name == "Masha" }.first 
+0

धन्यवाद! मैंने पहले निर्माण {$ 0} कभी नहीं मिला है। Google को खोजने के बारे में क्या पूछना है? –

+0

@AlexeyK https://developer.apple.com/library/ios/documentation/Swift/Conceptual/Swift_Programming_Language/Closures.html#//apple_ref/doc/uid/TP40014097-CH11-ID95 – Fantattitude

+0

में शॉर्टंड तर्क नामों के लिए खोजें एक बंद सिंटैक्स सरलीकरण - यह पैरामीटर प्रकार अनुमान, शॉर्टेंड तर्क नाम और निहित वापसी का उपयोग कर एक पिछला बंद है। [क्लोजर एक्सप्रेशन] पढ़ें (https://developer.apple.com/library/ios/documentation/Swift/Conceptual/Swift_Programming_Language/Closures।एचटीएमएल # // apple_ref/doc/uid/TP40014097-CH11-ID95) – Antonio

16

इस सुलझाने लाभ उठाने के लिए स्विफ्ट के flatMap समारोह होगा की एक दिलचस्प तरीका है।

var array = [[person1, person2, person3], [person9, person10, person11]] 

let flatArray = array.flatMap { $0 } 

flatArray अब प्रकार Array<Person> की [person1, person2, person3, person9, person10, person11] है।

for person in flatArray where person.name == "Masha" { 
    // Do something 
} 
:

for person in flatArray { 
    if person.name == "Masha" { 
     // Do something 
    } 
} 

तुम भी स्विफ्ट 2.0 का उपयोग करके आगे जा सकते हैं आप के लिए एक जहां खंड डाल करने के लिए है क्योंकि यह अनुमति देता है:

तो फिर तुम तुम क्या चाहते खोजने के लिए flatArray पर पुनरावृति कर सकते हैं

13

यहां तकनीक है जिसे 'चेनिंग' कहा जाता है

खेल का मैदानस्विफ्ट 3,1

import UIKit 

class Person { 
    var name = "" 
    var lastName = "" 
    var age = 0 
} 

var person1 = Person() 
person1.name = "Joe" 
person1.lastName = "Doe" 
person1.age = 21 

var person2 = Person() 
person2.name = "Julia" 
person2.lastName = "Ivanova" 
person2.age = 22 

var person3 = Person() 
person3.name = "Irina" 
person3.lastName = "Petrova" 
person3.age = 25 

var person9 = Person() 
person9.name = "Vova" 
person9.lastName = "Vovin" 
person9.age = 32 

var person10 = Person() 
person10.name = "Masha" 
person10.lastName = "Golovanova" 
person10.age = 20 

var person11 = Person() 
person11.name = "Petra" 
person11.lastName = "Andreeva" 
person11.age = 27 

var array = [[person1, person2, person3], [person9, person10, person11]] 

array 
    .flatMap{$0} 
    .forEach { (anyPerson:Person) in 

     if anyPerson.name == "Masha" { 
      //Do what you need 
      print(anyPerson.lastName) 
     } 
} 

खेल का मैदान से स्क्रीन शॉट: enter image description here

+1

एक त्वरित Google आधिकारिक दस्तावेज़ के साथ नहीं आया था। मैंने कुछ ब्लॉगों को एरे टू एरे जोड़ने के लिए एक एक्सटेंशन लिखने का उल्लेख किया था। क्या आप कुछ दस्तावेजों को इंगित कर सकते हैं? अग्रिम में धन्यवाद। – LiweiZ

+1

@LiweiZ 1. ऐरे 'अनुक्रम प्रकार' प्रोटोकॉल के अनुरूप है। प्रलेखन: [कड़ी] (https://developer.apple.com/library/prerelease/ios/documentation/Swift/Reference/Swift_SequenceType_Protocol/#//apple_ref/swift/intfm/SequenceType/s:FPSs12SequenceType7forEachuRq_S__Fq_FFqqq_S_9GeneratorSs13GeneratorType7ElementT_T_) 2। खेल के मैदान या एक्सकोड में -> 'cmd' + होवर माउस को .forEach विधि पर रखें और माउस क्लिक करें। –

+0

@ AlexeyBondarchuk आपके उत्तर के लिए धन्यवाद। आपके उत्तर और टिप्पणी दोनों को ऊपर उठाया। – LiweiZ

3

तेज 3:

forEach({element in 
    // do what you need 
}) 
+0

जो व्यक्तियों के वैक्टर प्राप्त करता है इसलिए लूप के लिए एक और की आवश्यकता होती है – Mark

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