我想在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)
如果我必须按顺序使用追加或插入,它将打破我想要的顺序。
答案 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]
。但没有进一步的信息,我不知道。