我很好奇如何用一个快速的元组做一个for循环。
我知道要访问每个成员,可以使用使用索引号的点符号。
var tupleList = ("A",2.9,3,8,5,6,7,8,9)
for each in tupleList {
println(each)
}
//Error:类型不符合协议序列
发布于 2014-07-18 18:34:49
可以,停那儿吧!
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)") }
注意:作为块的第二个参数传递的值是Any
类型。您必须将其转换回原始类型的值。
发布于 2018-05-19 11:22:33
您可以使用反射Swift 5
在游乐场里试试这个:
let tuple = (1, 2, "3")
let tupleMirror = Mirror(reflecting: tuple)
let tupleElements = tupleMirror.children.map({ $0.value })
tupleElements
输出:
发布于 2014-06-19 05:25:33
Swift目前不支持对元组进行迭代。
最大的原因是:
tupleList.0
)之外,无法在特定索引上访问元素。您可能真的想要一个下标tupleList[0]
,但是没有提供给我们。坦率地说,如果您想要迭代元组,那么我看不出您使用元组而不是Array的原因。
迭代元组是没有意义的,因为:
数组可以很好地迭代:
var list = ["A",2.9,3,8,5,6,7,8,9]
https://stackoverflow.com/questions/24299045
复制相似问题