有什么办法可以快速迭代一个元组吗?
我很好奇如何快速进行元组的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)。
有趣的是,iterate()
它甚至可以迭代其他类型的集合。
iterate([0,1]) { println("\($0) => \($1)") }iterate(["zero":0,"one":1]) { println("\($0) => \($1)") }
并且该集合包括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
。您必须将其强制转换回原始类型的值。
以上是 有什么办法可以快速迭代一个元组吗? 的全部内容, 来源链接: utcz.com/qa/404900.html