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
相关产品推荐
相关产品推荐

