Ios 如何使用循环访问对象数组的每个属性?

Ios 如何使用循环访问对象数组的每个属性?,ios,arrays,swift,Ios,Arrays,Swift,我有一个人对象: 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 } } 和两个阵列。一个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
    }
}
和两个阵列。一个
Person
对象数组,一个包含数组中每个属性的名称

var values = [Person]()
var attributes = ["name","city","country"]
例如,如果我向数组中添加两个新的
Person
对象:

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))
我想检索数组中每个对象的每个属性

var values = [Person]()
var attributes = ["name","city","country"]
如果要检索第一个元素的所有属性,可以执行以下操作:

values[0].name
values[0].city
values[0].country
但我想这样做:

let totalAttributes = attributes.count - 1
for i in 0...totalAttributes{
   var attribute = attributes[i]
   values[0].attribute
}
但是,正如我所想,这是行不通的

在本例中,我可以手动执行此操作,因为只有三个属性,但当对象中有20多个属性时,我不希望执行相同的操作

有没有办法在一个循环内完成


提前谢谢

如果您添加了一个返回Person类属性的函数,那么您应该能够执行所需的操作。如何处理这些值是另一回事。下面是如何更改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
    }

    func returnAttributes() -> [AnyObject]{
        return [name, city, country]
    }
}
在当前场景中,您也可以将返回类型设置为[String],但听起来您正在寻找一种解决方案,该解决方案允许灵活地返回哪些类型的对象,因此可能[AnyObject]是最好的

那么你可以做这样的事情:

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

您可以使用反射和镜像类型

let firstObj = values[0]
let personMirror = Mirror(reflecting: firstObj)
for child in personMirror.children {
    let (propertyName, propertyValue) = child
    print(propertyName)
    print(propertyValue)
}
您可以通过属性名称访问特定属性

示例:获取名为
name

personMirror.descendant("name")

让您的类继承自
NSObject
,然后您可以通过提供的方法获取/设置其属性:

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
    }
}
现在您可以使用:

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

您可以尝试使用所有属性制作一个字典,然后在循环中迭代字典的键,但这有点不令人满意。您是否在寻找一个更通用、更优雅的答案来回答这个问题?另外,您是否看到过这样的讨论:与其将
属性
作为数组,不如将其作为字典更容易。我使用的是Swift 3,它无法识别对象。应该是NSObject吗?谢谢你指出了这一点,我想我的操场没有注意到。在这种情况下,我会使用AnyObject。如果您演示如何仅在给定属性名称的情况下获取属性值,这可能是更好的答案。我编辑了我的答案,以包括按属性名称检索属性。如果我从数据库检索数据,并希望将其存储在值数组中,则每个Person对象都有30个属性。我必须写30行,循环中的每个属性一行吗?如果检索30对(
attributename
value
),循环中只需要1行代码:
person.setValue(value,forKey:attributename)