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

时间:2016-10-11 15:48:54

标签: ios arrays swift

我有一个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))

我想检索数组中每个对象的每个属性。

如果我想检索我可以做的第一个元素的所有属性:

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个属性时,我不想这样做。

有没有办法在循环中完成?

提前致谢!

3 个答案:

答案 0 :(得分:2)

您可以使用反射和MirrorType

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")

答案 1 :(得分:2)

让您的类继承自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")

答案 2 :(得分:0)

如果添加一个返回Person类属性的函数,那么您应该可以执行所需的操作。如何处理这些值是另一回事。以下是如何更改Person类的示例:

makemigrations

对于您当前的场景,您还可以将返回类型设置为[String],但听起来您正在寻找一种解决方案,允许在返回的对象类型方面具有灵活性,因此也许[AnyObject]是最好的。

那么你可以这样做:

migrate
相关问题