Arrays 在Swift中访问数组中的项时出现问题

Arrays 在Swift中访问数组中的项时出现问题,arrays,swift,Arrays,Swift,我所要做的就是访问原始数组的值,并将它们附加到新的单个数组中。但我一直在犯这样的错误: 无法将“[String]”类型的值转换为预期的参数类型“String” 用最简单的术语来说,我做错了什么?这是因为dwarfArray是一个字符串数组,需要追加一个字符串。然而,它得到的是一个字符串数组,而不仅仅是字符串 像这样试试 let arrayOfDwarfArrays = [["Sleepy", "Grumpy", "Doc"], ["Thorin", "Nori"]] var dwarfArra

我所要做的就是访问原始数组的值,并将它们附加到新的单个数组中。但我一直在犯这样的错误:

无法将“[String]”类型的值转换为预期的参数类型“String”


用最简单的术语来说,我做错了什么?

这是因为
dwarfArray
是一个字符串数组,需要追加一个字符串。然而,它得到的是一个字符串数组,而不仅仅是字符串

像这样试试

let arrayOfDwarfArrays = [["Sleepy", "Grumpy", "Doc"], ["Thorin", "Nori"]]

var dwarfArray: [String] = []
for dwarfName in arrayOfDwarfArrays {
    dwarfArray.append(dwarfName)
}
需要类型为
Element
的参数,该参数仅为单个元素。显然,仅当
元素
[String]
时,提供
[String]
作为此参数的参数才有效,即,如果数组的类型为
[[String]]
。由于情况并非如此,
Array.append(:)
不是正确的选择

相反,您应该使用,它需要类型为
S
的参数,其中
S
是其
元素
与数组元素相同的任何
序列
一致类型。这适用于要附加子阵列(dwarfName)的所有元素的情况

但在这种特殊情况下,使用简单的操作可以更好地表达此代码:

let arrayOfDwarfArrays = [["Sleepy", "Grumpy", "Doc"], ["Thorin", "Nori"]]

var dwarfArray: [String] = []
for dwarfName in arrayOfDwarfArrays {
    dwarfArray.append(contentsOf: dwarfName)
}

不需要重新发明轮子。您可以使用名为
joined()
的序列。它将返回一个
集合
,如果需要,您可以使用该集合初始化新数组:

let arrayOfDwarfArrays = [["Sleepy", "Grumpy", "Doc"], ["Thorin", "Nori"]]
let dwarfArray = arrayOfDwarfArrays.flatMap { $0 }
如果需要创建新数组,只需使用展平集合的元素对其进行初始化:

let dwarfCollections = [["Sleepy", "Grumpy", "Doc"], ["Thorin", "Nori"]]

// Use 'joined()' to access each element of each collection:
for dwarf in dwarfCollections.joined() {
    print(dwarf)
}
这会打印出来

困倦的

暴躁的

医生

索林

诺丽

[“困倦”、“暴躁”、“医生”、“托林”、“诺丽”]


技术上正确,但只使用
append(contentsOf:)
要好得多。首先,它只执行调整大小操作,而此代码可以执行任意数量的调整大小操作。
let dwarfCollections = [["Sleepy", "Grumpy", "Doc"], ["Thorin", "Nori"]]

// Use 'joined()' to access each element of each collection:
for dwarf in dwarfCollections.joined() {
    print(dwarf)
}
let dwarfs = Array(dwarfCollections.joined())  // ["Sleepy", "Grumpy", "Doc", "Thorin", "Nori"]
print(dwarfs)