gpt4 book ai didi

swift - 范围崩溃的不可能索引

转载 作者:行者123 更新时间:2023-11-28 09:21:52 28 4
gpt4 key购买 nike

在我正在处理的应用程序中,我必须通过指定元素在数组中的索引来获取数组中的一个元素,例如 array[index]。这是一个简单的 UICollectionView,其中填充了我从数组中获取的项目。

为了防止Index out of range异常,我是这样做的:

guard index < array.count else { return }
return array[index]

尽管我有这个守卫,但我在 array[index] 行上遇到了 Index out of range 异常(但并非总是如此)。

我不知道这怎么会发生。

我什至添加了另一张支票:

extension Collection where Indices.Iterator.Element == Index {
subscript (optional index: Index) -> Iterator.Element? {
return indices.contains(index) ? self[index] : nil
}
}

所以我正在这样做(这是应用程序的实际代码片段):

...
guard let section = chatSections[optional: indexPath.section] else {
return nil
}
guard indexPath.item < section.itemViewModels.count else {
return nil
}
return section.itemViewModels[optional: indexPath.item]

它并不总是发生,但有时我会在那里遇到“索引超出范围”异常。

Exception

我一天中的大部分时间都在调试,试图找出崩溃发生的条件,这样我也许就能找出原因,但它似乎是随机发生的。

有谁知道这怎么可能?有人遇到过这种问题吗?

最佳答案

您是否有机会从后台线程/队列进行任何更新?如果是这样,请确保您的 UI 交互是在主线程/队列上完成的,并且您没有更改 UI 背后的数组内容。

也就是说,如果您正在更改一个队列中的数组内容并尝试在发生这种情况时更新您的 UI,您的 guard 语句可能会在数组被其他地方修改之前传递,然后到您的其余部分时执行 UI 交互代码,索引可能不再有效。

如果没有更完整的图片,很难说出发生了什么,但是您添加的所有这些边界检查都是为了防止神秘变化的数组索引,这是多线程恶作剧的重要线索。

关于swift - 范围崩溃的不可能索引,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56601569/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com