একটি বস্তুর অ্যারে থেকে সম্পত্তি মানগুলির একটি অ্যারে পান


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অ্যারেতে থাকা সমস্ত বস্তুর গুলি একটি নতুন অ্যারেতে বের করা।

আমিও এই একই প্রশ্ন পেয়েছি । তবে এটি উদ্দেশ্য-সিতে তাই এটি এটি 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
আপনি যদি একটি usingচ্ছিক ব্যবহার করছেন, তা নিশ্চিত করুন! এটা। আমাকে ঘন্টা সময় নিয়েছে
ক্রিস

2
@ ক্রিসকে জোর করে মোড়ক খাওয়ানো সাধারণত একটি খারাপ অভ্যাস, কারণ যদি তা শোধ না করা হয় তবে অ্যাপটি ক্রাশ হয়ে যাবে। কঠোরভাবে প্রয়োজন হলেই এটি ব্যবহার করুন এবং পরিবর্তে optionচ্ছিক বাঁধাই (বা অন্য কোনও "নরম" মোড়কানো) পছন্দ করুন
আন্তোনিও

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]

২. 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]

৩. whileলুপ ব্যবহার করা

দ্রষ্টব্য যে সুইফ্টের সাথে, পর্দার আড়ালে, একটি forলুপ whileএকটি sequence'পুনরুক্তি' (কেবল আরও বিশদের জন্য ইটেটরপ্রোটোকল দেখুন) এর উপর একটি লুপ ।

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যে কে কনর্ফাম করে IteratorProtocolএবং Sequenceপ্রোটোকল

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]

K. কেভিসি এবং 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
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.