使用变量访问元组的值

时间:2017-12-26 00:03:27

标签: swift tuples swift4

如何根据动态值从元组中读取项目?例如,如果我想要" banana"我这样做:

0 start
0, 4
0, , 2, , 
0 ok
1 start
4, 6
Segmentation fault (core dumped)

但是如何使用存储在另一个变量中的值?

var tuple = ("banana", "sock", "shoe")
print(tuple.0)

1 个答案:

答案 0 :(得分:0)

元组不够灵活,无法做到这一点。你可以接近功能:

let tuple = ("banana", "sock", "shoe")

let first = { (t: (String, String, String)) -> String in t.0 }
let second = { (t: (String, String, String)) -> String in t.1 }
let third = { (t: (String, String, String)) -> String in t.2 }

let choice = first
print(first(tuple))

但这根本不可扩展;对于要与之交互的每个元组类型,你需要一组这样的函数。

一种选择可能是创建struct作为元组的替代方法。然后你可以使用KeyPath。例如:

struct Items
{
    let first: String
    let second: String
    let third: String

    init(tuple: (String, String, String))
    {
        self.first = tuple.0
        self.second = tuple.1
        self.third = tuple.2
    }
}

let choice = \Items.first

let items = Items(tuple: tuple)
print(items[keyPath: choice])

或者,如果你的元组像你的例子一样是同质的,另一个选择是转换为一个数组并使用数组下标:

extension Array where Element == String
{
    init(_ tuple: (String, String, String))
    {
        self.init([tuple.0, tuple.1, tuple.2])
    }
}

let array = Array(tuple)
let index = 0
print(array[index])

(类似下标的密钥路径也将在未来的Swift中出现,但在这种情况下,他们不会在常规下标之上购买任何东西。)