迭代Swift中的对象类属性

iFa*_*adi 31 swift

在Swift中是否有一种简单的方法来迭代类的属性.

即我有一个类Person,它有3个属性:name,lastname,age.

是否有类似的东西

for attribute in Person {
     println("\(attribute): \(attribute.value)")
}
Run Code Online (Sandbox Code Playgroud)

输出将是例如:

name: Bob
lastname: Max
age: 20
Run Code Online (Sandbox Code Playgroud)

moh*_*acs 56

他们已经删除了Swift 2.0中的反射.这就是我枚举属性和值的方式.

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 after
for (index, attr) in mirrored_object.children.enumerated() {
    if let property_name = attr.label as String! {
        print("Attr \(index): \(property_name) = \(attr.value)")
    }
}
Run Code Online (Sandbox Code Playgroud)

输出:
Attr 0:name =用户名
Attr 1:last_name =用户lastname
Attr 2:age = 20


Tee*_*ppa 12

是的,如果您只需要打印结构或类的属性,并且属性是简单类型(如String和Int),则可以使用reflectMirrorType.

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)
Run Code Online (Sandbox Code Playgroud)

如果你有嵌套的结构,枚举,你需要做更多的工作.

  • 假设我的班级正在实施协议.如何获取协议/超类的属性 (3认同)

Amm*_*eeb 5

正如@mohacs所建议的那样,您可以在所需的类中提供函数Description,如下所示;

func description() -> String{

        let mirrored_object = Mirror(reflecting: self)
        let str:NSMutableString = NSMutableString()
        for (index, attr) in mirrored_object.children.enumerated() {
            if let property_name = attr.label as String! {
                str.append(" Attr \(index): \(property_name) = \(attr.value)")
            }
        }
        //print("desc=\(str)")
        return str as String
    }
Run Code Online (Sandbox Code Playgroud)

然后简单地调用此实例方法

  let jsonOb:JsonModel = self.ObjArray[Index]
  print("jsonOb = \(jsonOb.description())")
Run Code Online (Sandbox Code Playgroud)