在Swift中无法访问数组数组中的项目

时间:2019-02-13 00:41:28

标签: arrays swift

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

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

我要做的就是访问原始数组数组的值,并将它们附加到新的单个数组中。但我不断收到此错误:

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

用最简单的话来说,我在做什么错了?

3 个答案:

答案 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类型的参数,其中SSequence相同的任何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”]