ऑब्जेक्ट एरे से संपत्ति मूल्यों की एक सरणी प्राप्त करें


113

नामक एक वर्ग है Employee

class Employee {

    var id: Int
    var firstName: String
    var lastName: String
    var dateOfBirth: NSDate?

    init(id: Int, firstName: String, lastName: String) {
        self.id = id
        self.firstName = firstName
        self.lastName = lastName
    }
}

और मेरे पास एक सरणी है Employee वस्तुओं । अब मुझे idउस सरणी में उन सभी वस्तुओं को एक नए सरणी में निकालने की आवश्यकता है।

मुझे भी ऐसा ही सवाल लगा । लेकिन यह Objective-C में है इसलिए इसे valueForKeyPathपूरा करने के लिए इसका उपयोग किया जा रहा है।

मैं स्विफ्ट में यह कैसे कर सकता हूं?

जवाबों:


234

आप mapविधि का उपयोग कर सकते हैं , जो एक निश्चित प्रकार के एक सरणी को दूसरे प्रकार के एक सरणी में बदल देता है - आपके मामले में, सरणी के Employeeसरणी से Int:

var array = [Employee]()
array.append(Employee(id: 4, firstName: "", lastName: ""))
array.append(Employee(id: 2, firstName: "", lastName: ""))

let ids = array.map { $0.id }

1
यही कारण है कि क्या mapकरता है - यह की एक सरणी बदल देती है Employeeकी एक सरणी के लिए Int, के साथ भरा idक्षेत्र। जो कहने के बराबर है "सभी उदाहरणों से आईडी फ़ील्ड निकालें Employeeऔर उन्हें एक सरणी में डालें"
एंटोनियो

4
@ इस्सु, यह उत्तर वही करता है जो आप चाहते हैं। यह s के एरे idsसे सभी idमानों के नाम से एक नया ऐरे बनाता है Employee। ध्यान दें, यह मूल सरणी को बरकरार रखता है।
वैकाव

2
स्विफ्ट 2 बीटा में ऐसा लगता है कि सही सिंटैक्स होगाarray.map( { $0.id })
टोटोरोत्रो

10
यदि आप एक वैकल्पिक का उपयोग कर रहे हैं, तो सुनिश्चित करें कि आप! यह। मुझे घंटों ले गया।
क्रिस

2
@ क्रिस मजबूर करने के लिए मजबूर करना आमतौर पर एक बुरा अभ्यास है, क्योंकि अगर शून्य यह एप्लिकेशन दुर्घटना का कारण होगा। इसका उपयोग केवल जब सख्ती से आवश्यक हो, और इसके बजाय वैकल्पिक बाइंडिंग (या किसी अन्य "नरम" अलौकिक) को पसंद करें
एंटोनियो

81

स्विफ्ट 5 समान वस्तुओं की एक सरणी से संपत्ति मूल्यों की एक सरणी प्राप्त करने के कई तरीके प्रदान करता है। अपनी आवश्यकताओं के अनुसार, आप अपनी समस्या को हल करने के लिए प्लेग्राउंड कोड उदाहरणों में से छह का चयन कर सकते हैं ।


1. mapविधि का उपयोग करना

स्विफ्ट के साथ, Sequenceप्रोटोकॉल के अनुरूप प्रकार एक map(_:)विधि है। निम्नलिखित नमूना कोड यह दिखाता है कि इसका उपयोग कैसे किया जाए:

class Employee {
    
    let id: Int, firstName: String, lastName: String
    
    init(id: Int, firstName: String, lastName: String) {
        self.id = id
        self.firstName = firstName
        self.lastName = lastName
    }

}

let employeeArray = [
    Employee(id: 1, firstName: "Jon", lastName: "Skeet"),
    Employee(id: 2, firstName: "Darin", lastName: "Dimitrov"),
    Employee(id: 4, firstName: "Hans", lastName: "Passant")
]

let idArray = employeeArray.map({ (employee: Employee) -> Int in
    employee.id
})
// let idArray = employeeArray.map { $0.id } // also works
print(idArray) // prints [1, 2, 4]

2. forलूप का उपयोग करना

class Employee {
    
    let id: Int, firstName: String, lastName: String

    init(id: Int, firstName: String, lastName: String) {
        self.id = id
        self.firstName = firstName
        self.lastName = lastName
    }

}

let employeeArray = [
    Employee(id: 1, firstName: "Jon", lastName: "Skeet"),
    Employee(id: 2, firstName: "Darin", lastName: "Dimitrov"),
    Employee(id: 4, firstName: "Hans", lastName: "Passant")
]

var idArray = [Int]()    
for employee in employeeArray {
    idArray.append(employee.id)
}
print(idArray) // prints [1, 2, 4]

3. whileलूप का उपयोग करना

ध्यान दें कि स्विफ्ट के साथ, पर्दे के पीछे, एक forलूप सिर्फ whileएक sequence'itter ( अधिक विवरण के लिए IteratorProtocol देखें) पर लूप है ।

class Employee {
    
    let id: Int, firstName: String, lastName: String
    
    init(id: Int, firstName: String, lastName: String) {
        self.id = id
        self.firstName = firstName
        self.lastName = lastName
    }

}

let employeeArray = [
    Employee(id: 1, firstName: "Jon", lastName: "Skeet"),
    Employee(id: 2, firstName: "Darin", lastName: "Dimitrov"),
    Employee(id: 4, firstName: "Hans", lastName: "Passant")
]

var idArray = [Int]()
var iterator = employeeArray.makeIterator()    
while let employee = iterator.next() {
    idArray.append(employee.id)
}
print(idArray) // prints [1, 2, 4]

4. एक का उपयोग करना और प्रोटोकॉल के structअनुरूप हैIteratorProtocolSequence

class Employee {
    
    let id: Int, firstName: String, lastName: String
    
    init(id: Int, firstName: String, lastName: String) {
        self.id = id
        self.firstName = firstName
        self.lastName = lastName
    }
    
}

struct EmployeeSequence: Sequence, IteratorProtocol {
    
    let employeeArray: [Employee]
    private var index = 0
    
    init(employeeArray: [Employee]) {
        self.employeeArray = employeeArray
    }
    
    mutating func next() -> Int? {
        guard index < employeeArray.count else { return nil }
        defer { index += 1 }
        return employeeArray[index].id
    }
    
}

let employeeArray = [
    Employee(id: 1, firstName: "Jon", lastName: "Skeet"),
    Employee(id: 2, firstName: "Darin", lastName: "Dimitrov"),
    Employee(id: 4, firstName: "Hans", lastName: "Passant")
]
let employeeSequence = EmployeeSequence(employeeArray: employeeArray)
let idArray = Array(employeeSequence)
print(idArray) // prints [1, 2, 4]

5. Collectionप्रोटोकॉल विस्तार और का उपयोग करनाAnyIterator

class Employee {
    
    let id: Int, firstName: String, lastName: String
    
    init(id: Int, firstName: String, lastName: String) {
        self.id = id
        self.firstName = firstName
        self.lastName = lastName
    }

}

extension Collection where Iterator.Element: Employee {
    
    func getIDs() -> Array<Int> {
        var index = startIndex
        let iterator: AnyIterator<Int> = AnyIterator {
            defer { index = self.index(index, offsetBy: 1) }
            return index != self.endIndex ? self[index].id : nil
        }
        return Array(iterator)
    }
    
}

let employeeArray = [
    Employee(id: 1, firstName: "Jon", lastName: "Skeet"),
    Employee(id: 2, firstName: "Darin", lastName: "Dimitrov"),
    Employee(id: 4, firstName: "Hans", lastName: "Passant")
]

let idArray = employeeArray.getIDs()
print(idArray) // prints [1, 2, 4]

6. KVC और का उपयोग NSArrayकी value(forKeyPath:)विधि

ध्यान दें कि इस उदाहरण को class Employeeइनहेरिट करने की आवश्यकता है NSObject

import Foundation

class Employee: NSObject {

    @objc let id: Int, firstName: String, lastName: String

    init(id: Int, firstName: String, lastName: String) {
        self.id = id
        self.firstName = firstName
        self.lastName = lastName
    }

}

let employeeArray = [
    Employee(id: 1, firstName: "Jon", lastName: "Skeet"),
    Employee(id: 2, firstName: "Darin", lastName: "Dimitrov"),
    Employee(id: 4, firstName: "Hans", lastName: "Passant")
]

let employeeNSArray = employeeArray as NSArray
if let idArray = employeeNSArray.value(forKeyPath: #keyPath(Employee.id)) as? [Int] {
    print(idArray) // prints [1, 2, 4]
}

5
विशाल ... कि जहां तक ​​मुझे समझ में आ रहा है संभव दृष्टिकोण सूची
Injectios
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.