如何根据动态值从元组中读取项目?例如,如果我想要" 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)
答案 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中出现,但在这种情况下,他们不会在常规下标之上购买任何东西。)