Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Arrays 将一个整数从一个数组传输到另一个数组会导致数组大小无效_Arrays_Swift - Fatal编程技术网

Arrays 将一个整数从一个数组传输到另一个数组会导致数组大小无效

Arrays 将一个整数从一个数组传输到另一个数组会导致数组大小无效,arrays,swift,Arrays,Swift,在我的项目中,我有两个int数组 在psedoocode中 var existingOrders:[ExistingOrder] ... var completedOrders:[CompletedOrder] .. protocol ValueProtocol { var value: Int { get set } } class ExistingOrder: ValueProtocol { var value: Int = 0 } class CompletedOrder

在我的项目中,我有两个int数组

在psedoocode中

var existingOrders:[ExistingOrder] ...
var completedOrders:[CompletedOrder] ..

protocol ValueProtocol {
    var value: Int { get set }
}


class ExistingOrder: ValueProtocol {
 var value: Int = 0
}

class CompletedOrder: ValueProtocol {
  var value: Int = 0
}
是的,我知道功能是一样的;但是我需要它是两个类,原因不在这个问题的范围之内

我正在编写的一个函数需要将一个订单从现有订单转移到已完成的订单

在我的代码中,我循环遍历所有我想要传递的值,然后传递它们

for (index, item) in self.completedOrders.enumerated() {
            item.value = Die.roll()
            self.transfer(index: index, destination: .existingOrder)
        }
传递函数将其从
existingOrder->completedOrder
移动,反之亦然

问题是:

当它通过上面显示的数组时,它将在传输过程中弹出一个对象;现在数组的大小已经改变,不再正确

从视觉上穿过它,它看起来是这样的

ie

因此for循环会遍历它需要传输的每个项,但是由于传输本身会修改for循环,因此会更改所述数组的内容并导致崩溃

我使用索引的原因是,有时我希望转移现有订单中的特定项目

我想知道如何避免这个问题


谢谢

以相反的顺序循环您的阵列。这样,在删除后面的项目时,前面的索引仍然有效:

for (index, item) in self.completedOrders.enumerated().reversed() {
    item.value = Die.roll()
    self.transfer(index: index, destination: .existingOrder)
}

下面是一个例子,说明了这是如何处理一组数字的,在这些数字中,我们去掉了赔率:

var numbers = Array(1...10) // [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]

var odds = [Int]()

for (index, number) in numbers.enumerated().reversed() {
    if number % 2 == 1 {
        odds.insert(number, at: 0)
        numbers.remove(at: index)
    }
}

print(numbers)  // [2, 4, 6, 8, 10]
print(odds)     // [1, 3, 5, 7, 9]

很酷,我会试一试——我还想我需要重构我的传递函数,使它成为一个通用对象,即:
func-transferOrder(order:C1,toDestination:orderbookerytype),其中C1:EntryProtocol
,但逆数组也会起作用,反转它似乎起作用,我会进一步测试它,我会接受答案。我可能会重构我的传输顺序函数,以使用遵循
EntryProtocol
var numbers = Array(1...10) // [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]

var odds = [Int]()

for (index, number) in numbers.enumerated().reversed() {
    if number % 2 == 1 {
        odds.insert(number, at: 0)
        numbers.remove(at: index)
    }
}

print(numbers)  // [2, 4, 6, 8, 10]
print(odds)     // [1, 3, 5, 7, 9]