迭代Swift

时间:2016-06-01 12:47:14

标签: 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.enumerate() {
        if let property_name = attr.label as String! {
            print("Attr \(index): \(property_name) = \(attr.value)")
        }
} 

但由于static值,它不会进入代码。有没有办法迭代这个struct

2 个答案:

答案 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