将Swift数组转换为元组数组

8

我有下面这两个数组:

let xaxis = ["monday", "tuesday", "wednesday", "thursday", "friday"]
let yaxis = [1, 2, 3, 4, 5]

我希望将它们合并为一个如下的数组:

[ ("monday", 1), ("tuesday", 2), ("wednesday", 3), ("thursday", 4), ("friday", 5)]

这不是一个字典,而是一个元组数组。 - 3stud1ant3
更新的问题 - Martheli
4个回答

21

使用 zipmap

let xaxis = ["monday", "tuesday", "wednesday", "thursday", "friday"]
let yaxis = [1, 2, 3, 4, 5]

let tuples = Array(zip(xaxis, yaxis))  // or `zip(xaxis, yaxis).map { ($0, $1) }`

我知道你询问的是元组,但你也可以考虑使用自定义对象,例如:

struct Day {
    let name: String
    let value: Int
}

let names = ["monday", "tuesday", "wednesday", "thursday", "friday"]
let values = [1, 2, 3, 4, 5]

let days = zip(names, values).map(Day.init)

这些方法与简单的for循环相比速度更快吗?请给出您的建议。 - 3stud1ant3
7
以上是我的建议。避免过早优化。始终使用最简洁、最表达力强的语法,不要担心优化,除非它可能具有实际影响。在只有5个项目时,性能差异是无法区分的。在发布版本构建时,性能几乎不存在。话虽如此,我想知道为什么您要使用元组。或者,为什么您要使用字符串字面值的数组而不是 Calendar.current.weekdaySymbols。在考虑用 for 循环替换 zip/map 之前,有很多事情需要担心。 - Rob
1
我用这两个数组作为示例,但是真正的应用程序不会在数组中包含月份或任何日历数据。我只是想举一个将两个数组(一个字符串类型,一个整数类型)转换为元组数组的示例。 - Martheli
.map { ($0, $1) } 不会进行转换,因此 Array(zip(xaxis, yaxis)) 更好,可以避免通常需要使用 transform+Array.init 的情况。 - user652038
同意。Array(zip(…)) 可能更好。谢谢。 - Rob

3

试试这个:

let arrayMerged = zip(xaxis, yaxis).map { ($0, $1) }

或者这样:
let arrayMerged = Array(zip(xaxis, yaxis))

后者的答案是,我想知道哪个更快? - Sentry.co

2

试试这个:

let xaxis = ["monday", "tuesday", "wednesday", "thursday", "friday"]

let yaxis = [1, 2, 3, 4, 5]

var newArr = [(String, Int)]()

for i in 0..<xaxis.count {
        newArr.append((xaxis[i], yaxis[i]))
}
print(newArr)

1
这不使用 yaxis 数组。 - rmaddy

1
let tuples = xaxis.enumerated().map { (index, value) in (value, yaxis[index]) }

假设 yaxis 的数量总是与 xaxis 相匹配。

1
这也假设xaxis数组中的值是唯一的。 - rmaddy
代码看起来简短干净,但如果用于大数组上则具有时间复杂度。如果考虑时间复杂度,则建议采用3stud1ant3的答案。 - yarlg

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接