使用变量作为索引的Swift Tuple索引?

Mik*_*lis 1 variables indexing tuples swift

使用变量作为索引的Swift Tuple索引?任何人都知道是否可以使用变量作为Swift元组索引的索引.我希望使用随机数从元组中选择和项目.我有随机数作为变量,但无法看到如何使用它作为元组的索引.我已经搜索了各个地方

dfr*_*fri 6

确保您选择了正确的数据结构

如果您已经达到了需要访问元组成员的点,就像"索引"一样,那么您应该查看数据结构,看看在这种情况下元组是否真的是您的正确选择.正如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.valueAny,因此我们需要执行尝试类型转换回元组的元素类型.如果您的元组包含不同类型的成员,则在编译时无法知道返回类型,并且您可能必须继续使用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 作为元组吗?”,并回答 - 你不能