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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.20 12:18:27