You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Swift 4中跳转ViewController时NSRangeException异常如何解决?

解决Swift 4跳转ViewController时的NSRangeException错误

嘿,这个错误我之前踩过类似的坑,咱们一步步拆解问题:

首先先解读下错误信息:index 18446744073709551615 beyond bounds [0 .. 0],这个超大的索引值其实是UInt.max,通常是因为把负数或者未初始化的无符号整数当成数组索引使用,系统把它转成了这个超大的无符号值,进而触发数组越界崩溃。结合你跳转VC的场景,可能的原因和解决方法如下:

1. 先排查Storyboard标识符与类关联问题

你的跳转代码用到了instantiateViewControllerWithIdentifier("nextView"),这里最容易出问题的点:

  • 确保Storyboard中第二个ViewController的Storyboard ID确实是nextView,注意Swift是大小写敏感的,别写错大小写或者多打空格;
  • 选中第二个VC,打开右侧的Identity Inspector,确认Class字段已经关联到NextViewController,并且Module选择正确(如果你的项目有多个Target或者框架的话);
  • 建议把强制类型转换改成可选绑定,避免类型不匹配导致的隐性崩溃,代码调整成这样:
guard let storyboard = self.storyboard,
      let vc = storyboard.instantiateViewController(withIdentifier: "nextView") as? NextViewController else {
    print("无法获取目标ViewController:标识符错误或者类型不匹配")
    return
}
self.present(vc, animated: true)

2. 检查数组访问的代码

错误提示明确是数组越界,重点看跳转前后执行的代码:

  • 第一个VC的按钮点击事件里,有没有访问数组的逻辑?比如某个数组是空的(count == 0),但你用了错误的索引(比如负数、未初始化的变量)去取元素;
  • 第二个VC的viewDidLoad、init或者其他生命周期方法里,有没有初始化或访问数组的代码?比如你写了myArray[index],但index的值是-1,转成无符号整数就会变成那个超大的18446744073709551615,直接触发崩溃;
  • 可以在数组访问的地方加个安全判断,比如:
if index >= 0 && index < myArray.count {
    let element = myArray[index]
    // 后续逻辑
} else {
    print("数组索引越界:index = \(index),数组长度 = \(myArray.count)")
}

3. 排查隐性的未初始化变量

有时候你可能声明了索引变量但没初始化,比如:

var index: UInt
// 没给index赋值就直接用了
let element = myArray[Int(index)]

未初始化的UInt变量会默认是UInt.max,转成Int就会变成负数,访问数组自然就越界了。确保所有用到的索引变量都有正确的初始值。

先从这几个方向排查,应该能找到问题所在~

内容的提问来源于stack exchange,提问作者mab

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.26 09:28:30