小编典典

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

swift

我很好奇如何快速进行元组的for循环。

我知道要访问每个成员,您可以使用带点号的索引号

var tupleList = ("A",2.9,3,8,5,6,7,8,9)

for each in tupleList {
    println(each)
}

//错误:类型不符合协议顺序


阅读 415

收藏
2020-07-07

共1个答案

小编典典

是的你可以!

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。您必须将其强制转换回原始类型的值。

2020-07-07