Arrays Swift:如何按特定顺序将项目插入阵列?
我想在Swift中的特定索引处插入项目。但出现错误:Arrays Swift:如何按特定顺序将项目插入阵列?,arrays,swift,Arrays,Swift,我想在Swift中的特定索引处插入项目。但出现错误:索引超出范围 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) 如果我必须按顺序使用append或insert,它将打破我想要的顺序。您正在尝试在索引3的空数组中插入一个项。这导致了崩溃 您可能需要使用默认值初始化数组: var a
索引超出范围
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)
如果我必须按顺序使用append或insert,它将打破我想要的顺序。您正在尝试在索引3的空数组中插入一个项。这导致了崩溃 您可能需要使用默认值初始化数组:
var a = Array<String>(count: 10, repeatedValue: "")
a.insert("a", atIndex: 3)
print(a)
var a=Array(计数:10,repeatedValue:)
a、 插入(“a”,索引:3)
印刷品(a)
但您不是在插入,而是在修改值,因此可以通过以下方式实现相同的效果:
var a = Array<String>(count: 10, repeatedValue: "")
a[3] = "a"
print(a)
var a=Array(计数:10,repeatedValue:)
a[3]=“a”
印刷品(a)
您试图在索引3处的空数组中插入一个项。这导致了崩溃
您可能需要使用默认值初始化数组:
var a = Array<String>(count: 10, repeatedValue: "")
a.insert("a", atIndex: 3)
print(a)
var a=Array(计数:10,repeatedValue:)
a、 插入(“a”,索引:3)
印刷品(a)
但您不是在插入,而是在修改值,因此可以通过以下方式实现相同的效果:
var a = Array<String>(count: 10, repeatedValue: "")
a[3] = "a"
print(a)
var a=Array(计数:10,repeatedValue:)
a[3]=“a”
印刷品(a)
如果您想使用数组,@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"]
var dict:[Int:String]=[:]
dict[3]=“a”
dict[1]=“b”
dict[0]=“c”
dict[2]=“d”
印刷体(dict)/[2:d,3:a,1:b,0:c”]
打印(dict.sort{$0.0.0<$0.1.0}.map{$0.1})/[“c”、“b”、“d”、“a”]
如果您想使用数组,@fiks的回答确实解释了问题和正确的解决方案
字典
由于您希望执行随机插入,因此使用字典
而不是数组
似乎是一个更灵活的选择
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"]
var dict:[Int:String]=[:]
dict[3]=“a”
dict[1]=“b”
dict[0]=“c”
dict[2]=“d”
印刷体(dict)/[2:d,3:a,1:b,0:c”]
打印(dict.sort{$0.0.0<$0.1.0}.map{$0.1})/[“c”、“b”、“d”、“a”]
代码的问题是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)
}
}
}
扩展数组{
mutating func insert(元素:元素,索引:Int,withDefaultValue:element){
如果self.endIndex
这几乎是不言自明的
这也可能是XY问题。为此,您可能只需要一个
[Int:String]
。但是没有进一步的信息,我不知道。您的代码的问题是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)
}
}
}
扩展数组{
mutating func insert(元素:元素,索引:Int,withDefaultValue:element){
如果self.endIndex
这几乎是不言自明的
这也可能是XY问题。为此,您可能只需要一个
[Int:String]
。但是没有进一步的信息,我不知道。我想这应该是答案!!我知道。我试过了<代码>数组(计数:10,重复值:nil)QuotesModel是数据模型。错误是:表达式类型“Array”在没有更多上下文的情况下是不明确的
您的“QuotesModel”是如何定义的?您可能还需要使用选项对其进行初始化:数组(计数:10,重复值:nil)
我已经用您的方法进行了测试,但它仍然不起作用。这个问题已经解决了,但我仍然不理解insert-at-index机制<代码>变量a=[String?](计数:4,重复值:nil)a.insert(“a”,atIndex:3)a.insert(“b”,atIndex:1)a.insert(“c”,atIndex:0)a.insert(“d”,atIndex:2)print(a)我已经测试了这段代码,它打印了8个元素,它没有覆盖我想要的索引项,我想这应该是答案吧!!我知道。我试过了<代码>数组(计数:10,重复值:nil)QuotesModel是数据模型。错误是:表达式类型“Array”在没有更多上下文的情况下是不明确的
您的“QuotesModel”是如何定义的?您可能还需要使用选项对其进行初始化:数组(计数:10,重复值:nil)
我已经用您的方法进行了测试,但它仍然不起作用。这个问题已经解决了,但我仍然不理解insert-at-index机制<代码>变量a=[String?](计数:4,重复值:nil)a.insert(“a”,atIndex:3)a.insert(“b”,atIndex:1)a.insert(“c”,atIndex:0)a.insert(“d”,atIndex:2)print(a)我已经测试了这段代码,它打印了8个元素,它没有覆盖我想要的索引项