Swift:如何将项目插入具有特定顺序的数组?

时间:2016-07-14 12:18:09

标签: arrays swift

我想在Swift中的特定索引处插入项目。但是发生了错误:Index is out of range

var a = [String]()
a.insert("a", atIndex: 3)
a.insert("b", atIndex: 1)
a.insert("c", atIndex: 0)
a.insert("d", atIndex: 2)
print(a)

如果我必须按顺序使用追加或插入,它将打破我想要的顺序。

3 个答案:

答案 0 :(得分:2)

您正尝试在索引3处的空数组中插入一个项目。这会导致崩溃。

您可能希望使用默认值初始化数组:

var a = Array<String>(count: 10, repeatedValue: "")
a.insert("a", atIndex: 3)
print(a)

但是你没有插入,你正在修改价值,所以你可以用这种方式实现同​​样的目标:

var a = Array<String>(count: 10, repeatedValue: "")
a[3] = "a"
print(a)

答案 1 :(得分:2)

@fiks 的答案确实解释了问题,并且如果您想使用数组,这是正确的解决方案。

词典

由于您要执行随机插入,因此使用Dictionary代替Array似乎更灵活。

var dict: [Int:String] = [:]
dict[3] = "a"
dict[1] = "b"
dict[0] = "c"
dict[2] = "d"

print(dict) // [2: "d", 3: "a", 1: "b", 0: "c"]
print(dict.sort { $0.0.0 < $0.1.0}.map { $0.1 } ) // ["c", "b", "d", "a"]

答案 2 :(得分:0)

您的代码存在的问题是insert的第二个参数必须小于或等于数组的endIndex

如果要将索引3处的元素插入到长度为零的数组中,则不能!因为如果索引3处有一个元素,那么索引0,1,2也必须有一个元素!这就是数组的工作方式:它是连续的。

我想你希望索引0,1和2的元素是一些默认值。然后使用此扩展

extension Array {
    mutating func insert(element: Element, atIndex index: Int, withDefaultValue value: Element) {
        if self.endIndex < index {
            let diff = index - endIndex
            for _ in 0...diff {
                self.append(value)
            }
            self[endIndex - 1] = element
        } else {
            insert(element, atIndex: index)
        }
    }
}

这几乎是不言自明的。

这也可能是XY问题。您可能只需要一个[Int: String]。但没有进一步的信息,我不知道。