我很好奇如何快速进行元组的for循环。
我知道要访问每个成员,您可以使用带点号的索引号
var tupleList = ("A",2.9,3,8,5,6,7,8,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,reflect(it).count为0)。
.0
reflect(it).count
有趣的是,iterate()它甚至可以迭代其他类型的集合。
iterate()
iterate([0,1]) { println("\($0) => \($1)") } iterate(["zero":0,"one":1]) { println("\($0) => \($1)") }
并且该集合包括class和struct!
class
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)") }
注意:作为块的第二个参数传递的值是type Any。您必须将其强制转换回原始类型的值。
Any