let arrayOfDwarfArrays = [["Sleepy", "Grumpy", "Doc"], ["Thorin", "Nori"]]
var dwarfArray: [String] = []
for dwarfName in arrayOfDwarfArrays {
dwarfArray.append(dwarfName)
}
我要做的就是访问原始数组数组的值,并将它们附加到新的单个数组中。但我不断收到此错误:
无法将类型“ [String]”的值转换为预期的参数类型“ String”
用最简单的话来说,我在做什么错了?
答案 0 :(得分:1)
之所以发生这种情况,是因为dwarfArray
是一个字符串数组,希望附加一个字符串。但是,它得到的是字符串数组,而不仅仅是字符串。
尝试这样
let arrayOfDwarfArrays = [["Sleepy", "Grumpy", "Doc"], ["Thorin", "Nori"]]
var dwarfArray: [String] = []
for dwarfName in arrayOfDwarfArrays {
dwarfArray.append(contentsOf: dwarfName)
}
答案 1 :(得分:1)
Array.append(_:)
需要类型为Element
的参数,该参数仅是一个元素。显然,仅在[String]
为Element
,即数组类型为[String]
的情况下,提供[[String]]
作为该参数的参数是有效的。由于情况并非如此,Array.append(_:)
不是正确的选择。
相反,您应该使用Array.append(contentsOf:)
,它需要一个S
类型的参数,其中S
是Sequence
相同的任何Element
符合类型作为数组的元素。当您希望追加子数组(dwarfName)的所有元素时,此方法非常适合。
let arrayOfDwarfArrays = [["Sleepy", "Grumpy", "Doc"], ["Thorin", "Nori"]]
var dwarfArray: [String] = []
for dwarfName in arrayOfDwarfArrays {
dwarfArray.append(contentsOf: dwarfName)
}
在这种情况下,使用简单的Array.flatMap(_:)
操作可以更好地表达该代码:
let arrayOfDwarfArrays = [["Sleepy", "Grumpy", "Doc"], ["Thorin", "Nori"]]
let dwarfArray = arrayOfDwarfArrays.flatMap { $0 }
答案 2 :(得分:1)
无需重新发明轮子。您可以使用名为joined()
的序列instance method。它将返回一个FlattenCollection<[[String]]>
,您可以根据需要使用它初始化一个新数组:
let dwarfCollections = [["Sleepy", "Grumpy", "Doc"], ["Thorin", "Nori"]]
// Use 'joined()' to access each element of each collection:
for dwarf in dwarfCollections.joined() {
print(dwarf)
}
如果您需要创建一个新数组,只需使用flatten集合的元素对其进行初始化:
let dwarfs = Array(dwarfCollections.joined()) // ["Sleepy", "Grumpy", "Doc", "Thorin", "Nori"]
print(dwarfs)
这将打印
困
脾气暴躁
文档
索林
Nori
[“ Sleepy”,“脾气暴躁”,“ Doc”,“ Thorin”,“ Nori”]