有什么办法可以快速迭代一个元组吗?

我很好奇如何快速进行元组的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元组或“单” .0reflect(it).count为0)。

有趣的是,iterate()它甚至可以迭代其他类型的集合。

iterate([0,1])              { println("\($0) => \($1)") }

iterate(["zero":0,"one":1]) { println("\($0) => \($1)") }

并且该集合包括classstruct

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

回到顶部