Swift遍历数组正常但下标访问触发数组越界的问题排查
问题分析与解决:ViewController中loadView访问数组下标越界
问题原因
在Swift的UIViewController生命周期里,loadView()的执行时机早于viewDidLoad()。你把数组pairs的加载逻辑放在viewDidLoad()中,导致loadView()执行时pairs还未完成初始化,此时直接访问pairs[0].word1就会触发「Fatal error: Index out of range」下标越界错误。
解决方案
方案一:提前初始化数组
将pairs的加载逻辑移到loadView()执行前完成,比如在ViewController的初始化方法中加载数组,保证loadView()运行时数组已准备就绪:
class YourViewController: UIViewController { var pairs: [PairModel] = [] override init(nibName nibNameOrNil: String?, bundle nibBundleOrNil: Bundle?) { super.init(nibName: nibNameOrNil, bundle: nibBundleOrNil) // 在此处加载数组数据 pairs = fetchPairsData() } required init?(coder: NSCoder) { super.init(coder: coder) pairs = fetchPairsData() } private func fetchPairsData() -> [PairModel] { // 替换为实际的数据加载逻辑(本地文件/网络请求等) return [PairModel(word1: "test1", word2: "test2")] } }
方案二:在loadView中添加安全校验
如果无法提前初始化数组,在loadView()中访问数组前先判断数组是否为空,避免触发越界错误:
override func loadView() { super.loadView() guard !pairs.isEmpty else { // 数组未初始化时的 fallback 逻辑,比如显示占位视图 return } // 安全访问数组元素 let targetWord = pairs[0].word1 // 后续视图处理逻辑 }
方案三:将视图逻辑移至viewDidLoad及之后
如果相关视图逻辑不需要在loadView()阶段执行,直接把代码迁移到viewDidLoad()或更晚的生命周期方法(如viewWillAppear(_:))中,确保数组已完成加载:
override func viewDidLoad() { super.viewDidLoad() // 加载数组数据 pairs = fetchPairsData() // 安全访问数组元素 let targetWord = pairs[0].word1 // 更新视图内容 }
内容的提问来源于stack exchange,提问作者Michael Rowe
相关产品推荐
相关产品推荐

