在Swift中迭代结构属性

在Swift中迭代结构属性,swift,Swift,我在swift中使用struct class Constants { struct const { static let signupFirstName = "signupFirstName" } } 我想迭代这个结构。对于迭代,我使用: let mirrored_object = Mirror(reflecting: Constants.const()) for (index, attr) in mirrored_object.children.enumer

我在swift中使用struct

class Constants {
    struct const {
        static let signupFirstName = "signupFirstName"
    }
} 
我想迭代这个结构。对于迭代,我使用:

let mirrored_object = Mirror(reflecting: Constants.const())
for (index, attr) in mirrored_object.children.enumerate() {
        if let property_name = attr.label as String! {
            print("Attr \(index): \(property_name) = \(attr.value)")
        }
} 

但由于<代码>静态值,它不会进入代码。是否有任何方法可以迭代此
结构?

您可以通过在类级别访问变量来直接执行此操作

if let property_value = const.signupFirstName as String! {
   print("hello \(property_value)")
}

确保从类it self
const
访问它,而不是从实例
const()
访问它。由于变量是静态的,您无法从
实例
访问它,因此您必须直接使用

,因为静态成员在技术上是类型的一部分,而不是实例,因此您需要以这种方式接近它以反映类型本身:

let mirrored_object = Mirror(reflecting: Constants.const.self)
然而,斯威夫特对类型本身的自动反射目前似乎还没有实现,所以即使上面的代码行也不起作用

剩下最后一个选项,就是定义自己的自定义镜像,以便在类型的实例上进行反射。可能看起来像这样:

class Constants {
    struct const : CustomReflectable {
        static let signupFirstName = "signupFirstName"
        func customMirror() -> Mirror {
            return Mirror(self, children: ["signupFirstName" : const.signupFirstName])
        }
    }
}
如果使用类似于上述的CustomReflect实现修改代码,那么遍历结构成员的循环现在就可以工作了


快速思考最终会变得更好,在此之前,您可能希望尝试不同的方法。

谢谢您的回答。假设我在结构中有多个静态变量,比如:Static let signupLastName=“signupLastName”、Static let signupEmail=“signupEmail”等。现在,我要动态循环这个结构,而不是“返回镜像(self,children:[“signupFirstName”:const.signupFirstName])。我该怎么办?请提供帮助。@user3897036不幸的是,无法通过动态循环创建自定义镜像。MirrorType的初始值设定项只接受字典文本,这最终意味着您必须传入希望反映的确切值,并且不可能基于变量循环或生成,等等:(同样,快速反思在未来会变得更好,但现在它非常有限,也不是很有用。你可能想尝试一种不同的方法来实现你的目标。