我有一些经过良好测试的代码,以前从未崩溃过.自从升级到Xcode 15,我突然在一些客户设备上崩溃了index out of range次.它从来没有发生在我本地,我只有从试飞崩溃转储.我不知道这是从哪里来的,特别是因为我正在判断边界.text.count > index判断应该确保索引在范围内,或者我遗漏了什么?我的同事说是编译器的问题.你知道吗?

这是一个更大的功能的一部分,但相关部分是:

if let firstEnum = stateActions.first(where: { $0.type == .enumVar }){
    if let arg = firstEnum.arg,
       arg.count > 2, 
       variableDataDict.keys.contains(firstEnum.endpoint),
       let varData = variableDataDict[firstEnum.endpoint],
       let index = varData.value as? Int, //varData.value is Any?
       let texts = varData.texts, //varData.texts is [String]?
       texts.count > index
    {
        let text = texts[index] // <- This is where the crash is reported
        buttonText += "\n" + text
    }
}

推荐答案

为什么会发生这种情况?

看一下这个例子:

let allTexts = ["0", "1", "2", "3", "4", "5"]
let texts = allTexts[4...]

print(texts.count) // Prints 2
print(texts[0]) // Fatal error: Index out of bounds

这是因为虽然数组contains有两个元素,但它们的索引并不像您预期的那样.

texts.indices // would be: 4..<6

How to make it behave as I expected originally?

✅您可以将其转换为数组以重置索引,如下所示:

Array(texts).indices // would be: 0..<2

这样,下面的代码就不会抛出错误:

Array(texts)[0] // would be: 4

💡:更好的判断

不需要比较countindex,您可以判断:

if texts.indices.contains(index)

这样,您就可以确保直接访问texts[index]

Swift相关问答推荐

在列表项内的NavigationLink中的按钮无法正常工作

如何在SWIFT中轻松格式化公制和英制使用的UnitVolume

如何在visionOS中进行购买?&# 39;购买(选项:)在visionOS中不可用

从后台线程获取@发布属性的值(不更改它)是正确的吗?

当计数大于索引时,索引超出范围崩溃

为什么要在SWIFT RandomAccessCollection协议中重新定义元素类型?

是否可以将具有关联值的枚举强制转换为其类型与关联值匹配的变量?

如何使 onKeyPress 与 TextField 快速配合使用?

找出touch 点的屏幕亮度

除法中如果除以完全因数需要更长时间吗?

如何在 SceneKit 上制作毛玻璃效果

如何制作具有 2 个视图的 3D 旋转动画?

UIButton 配置不更新按钮标题

对齐时如何避免图像尺寸缩小

无法分配给属性:absoluteString是一个只能获取的属性

在 iOS 中使用 Swift 保存 PDF 文件并显示它们

自定义 Google 登录按钮 - iOS

如何在 Swift 中判断变量的类型

在 Swift 中从服务器播放视频文件

swift中的匿名类