如果您已经达到了需要访问元组成员的点,就像"索引"一样,那么您应该查看数据结构,看看在这种情况下元组是否真的是您的正确选择.正如MartinR在评论中提到的那样,数组可能是更合适的选择,或者如simpleBob所提到的那样,是一本字典.
您可以使用运行时内省来访问元组的镜像表示的子元素,并在给定提供的索引的情况下选择子值.
例如,对于所有元素属于同一类型的5元组:
func getMemberOfFiveTuple<T>(tuple: (T, T, T, T, T), atIndex: Int) -> T? {
let children = Mirror(reflecting: tup).children
guard case let idx = IntMax(atIndex)
where idx < children.count else { return nil }
return children[children.startIndex.advancedBy(idx)].value as? T
}
let tup = (10, 11, 12, 13, 14)
let idx = 3
if let member = getMemberOfFiveTuple(tup, atIndex: idx) {
print(member)
} // 13
Run Code Online (Sandbox Code Playgroud)
请注意,类型child.value是Any,因此我们需要执行尝试类型转换回元组的元素类型.如果您的元组包含不同类型的成员,则在编译时无法知道返回类型,并且您可能必须继续使用Any返回元素的类型.
Sha*_* Of -2
只要元组索引只是默认名称,您可以提供自己的名称
let testTuple = (first: 1, second: 2.0)
let first: Int = testTuple.first
let second: Double = testTuple.second
Run Code Online (Sandbox Code Playgroud)
您不能使用变量作为索引。非常接近的问题“我可以使用 KVC 作为元组吗?”,并回答 - 你不能