¿Cómo acceder a cada atributo de una matriz de objects utilizando un ciclo?

Tengo un object Person :

 class Person{ var name: String var city: String var country: String init(name: String, city: String, country: String){ self.name = name self.city = city self.country = country } } 

y dos arreglos. Una matriz de objects Person y una con los nombres de cada uno de los attributes de la matriz.

 var values = [Person]() var attributes = ["name","city","country"] 

y, por ejemplo, si agrego dos nuevos objects Person a la matriz:

 values.append(Person(name: "Peter" as! String, city: "Paris" as! String, country: "France" as! String)) values.append(Person(name: "Andrew" as! String, city: "Madrid" as! String, country: "Spain" as! String)) 

Me gustaría recuperar cada uno de los attributes de cada object de la matriz.

Si quiero recuperar todos los attributes del primer elemento, puedo hacer lo siguiente:

 values[0].name values[0].city values[0].country 

pero me gustaría hacerlo en el path:

 let totalAttributes = attributes.count - 1 for i in 0...totalAttributes{ var attribute = attributes[i] values[0].attribute } 

Pero esto, como supuse, no funcionó.

En este caso, puedo hacerlo manualmente porque solo hay tres attributes, pero no me gustaría hacer lo mismo cuando tenga más de 20 attributes dentro del object.

¿Hay alguna manera de hacerlo dentro de un ciclo?

¡Gracias por adelantado!

Deje que su class henetworkinge de NSObject , luego puede get / establecer sus properties según los methods proporcionados:

 class Person: NSObject { var name: String var city: String var country: String init(name: String, city: String, country: String){ self.name = name self.city = city self.country = country } } 

Ahora puedes usar:

 var person = Person(...) ... person.setValue("Peter", forKey: "name") ... let name = person.value(forKey: "name") 

Puede hacer uso de la reflexión y MirrorType

 let firstObj = values[0] let personMirror = Mirror(reflecting: firstObj) for child in personMirror.children { let (propertyName, propertyValue) = child print(propertyName) print(propertyValue) } 

Puede acceder a una propiedad específica por el nombre de la propiedad.

Ejemplo: obtenga el valor del name de la propiedad

 personMirror.descendant("name") 

Si agrega una function que devuelve los attributes de su class Persona, entonces debería poder hacer lo que quiera. Cómo procesaría estos valores es otra historia. A continuación se muestra un ejemplo de cómo cambiaría su class de Persona:

 class Person{ var name: String var city: String var country: String init(name: String, city: String, country: String){ self.name = name self.city = city self.country = country } func returnAttributes() -> [AnyObject]{ return [name, city, country] } } 

Con su escenario actual, también podría tener el tipo de retorno ser [String], pero parece que está buscando una solución que permita la flexibilidad en términos de qué tipo de objects está volviendo, por lo que tal vez [AnyObject] sea el mejor.

Entonces podrías hacer algo como esto:

 let totalAttributes = attributes.count - 1 for i in 0...totalAttributes{ values[0].returnAttributes //returns (for example): ["Peter", "Paris", "France"] }