我在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)")
}
}
但由于static
值,它不会进入代码。有没有办法迭代这个struct
?
答案 0 :(得分:1)
由于静态成员在技术上是类型的一部分而不是实例,因此您需要以这种方式接近它以反映类型本身:
class Constants {
struct const : CustomReflectable {
static let signupFirstName = "signupFirstName"
func customMirror() -> Mirror {
return Mirror(self, children: ["signupFirstName" : const.signupFirstName])
}
}
}
然而,Swift对类型本身的自动反映此时似乎并未实现,因此即使上述行也无法正常工作。
留下最后一个选项,即定义您自己的自定义镜像以反映您的类型的实例。这可能看起来像这样:
print (df[(df.module == 'CS1203') & (df.q1 == 4)])
year course module q1 q2
0 2015 Physics CS1203 4 2
1 2015 Physics CS1203 4 3
3 2015 Physics CS1203 4 4
print (len(df[(df.module == 'CS1203') & (df.q1 == 4)]))
3
如果使用类似于上面的CustomReflectable实现修改代码,那么迭代遍历struct成员的循环现在可以正常工作。
Swift反射最终会变得更好,您可能希望在此之前尝试不同的方法。
答案 1 :(得分:0)
您可以通过访问类级别的变量
直接执行此操作if let property_value = const.signupFirstName as String! {
print("hello \(property_value)")
}
请务必从自己的课程const
而不是实例const()
访问它。由于变量是静态的,因此无法从instance
访问它,您必须直接使用class