我有一个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个属性时,我不想这样做。
有没有办法在循环中完成?
提前致谢!
答案 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