Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

iterate over object class attributes in Swift

Tags:

swift

Is there a Simple way in Swift to iterate over the attributes of a class.

i.e. i have a class Person, and it has 3 attributes: name, lastname, age.

is there something like

for attribute in Person {      println("\(attribute): \(attribute.value)") } 

the output would be for example:

name: Bob lastname: Max age: 20 
like image 533
iFadi Avatar asked Aug 23 '14 14:08

iFadi


2 Answers

They have removed reflect within Swift 2.0. This is how I am enumerating attributes and values.

class People {     var name = ""     var last_name = ""     var age = 0 }  var user = People() user.name  = "user name" user.last_name = "user lastname" user.age = 20  let mirrored_object = Mirror(reflecting: user)  // Swift 2 for (index, attr) in mirrored_object.children.enumerate() {     if let property_name = attr.label as String! {         print("Attr \(index): \(property_name) = \(attr.value)")     } }  // Swift 3 and later for (index, attr) in mirrored_object.children.enumerated() {     if let property_name = attr.label as String! {         print("Attr \(index): \(property_name) = \(attr.value)")     } } 

Output:
Attr 0: name = user name
Attr 1: last_name = user lastname
Attr 2: age = 20

like image 191
modus Avatar answered Sep 22 '22 14:09

modus


Yes, if you just need to print properties of a struct or class, and the properties are simple types like String and Int, you can use reflect and MirrorType.

func print_properties(mirror: MirrorType) {     for i in 0..<mirror.count {         let (name, childMirror) = mirror[i]         let value = childMirror.value         println("\(i): \(name) = \(value)")     } }  struct Person {     let first_name: String     let last_name: String     let age: Int }  let john = Person(first_name:"John", last_name:"Doe", age:27) let mirror = reflect(john) print_properties(mirror) 

If you have nested structs, enums, you need to do a bit more work.

like image 35
Teemu Kurppa Avatar answered Sep 20 '22 14:09

Teemu Kurppa