我很好奇如何做一个for循环与一个元组在swift。
我知道,要访问每个成员,你可以使用点表示法使用索引号
var tupleList = ("A",2.9,3,8,5,6,7,9) for each in tupleList { println(each) }
//错误:类型不符合协议序列
是的你可以!
func iterate<C,R>(t:C,block:(String,Any)->R) { let mirror = reflect(t) for i in 0..<mirror.count { block(mirror[i].0,mirror[i].1.value) } }
瞧!
let tuple = ((false,true),42,42.195,"42.195km") iterate(tuple) { println("\($0) => \($1)") } iterate(tuple.0){ println("\($0) => \($1)")} iterate(tuple.0.0) { println("\($0) => \($1)")} // no-op
注意,最后一个不是一个元组,所以没有发生任何事情(虽然它是一个1元组或“单个”哪些内容可以访问.0,反射(它).count是0)。
有趣的是,iterate()可以迭代其他类型的集合。
iterate([0,1]) { println("\($0) => \($1)") } iterate(["zero":0,"one":1]) { println("\($0) => \($1)") }
这个集合包括类和struct!
struct Point { var x = 0.0,y = 0.0 } class Rect { var tl = Point(),br = Point() } iterate(Point()) { println("\($0) => \($1)") } iterate(Rect()) { println("\($0) => \($1)") }
注意:作为块的第二个参数传递的值是Any类型。您必须将其转换回原始类型的值。