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

Swift iOS中解决Fatal error: Index out of range问题求助

解决RSS阅读器的Index out of range崩溃问题

这个崩溃的核心原因很明确:feedImgs数组的长度和myFeed不匹配。

你测试的Sky News RSS可能每条内容都附带了图片,所以XmlParserManager返回的img数组和feeds数组长度一致,不会触发越界。但https://www.widgeti.co.il/feed里的部分条目没有提供图片,导致feedImgs的元素数量比myFeed少,当tableView尝试用indexPath.row访问feedImgs时,就会超出数组的最大索引,抛出Fatal error: Index out of range。

具体修复步骤

1. 同步两个数组的长度

在解析完成后,确保feedImgs的元素数量和myFeed完全一致,没有图片的条目用空值占位:

func loadRss(_ data: URL) {
    let myParser : XmlParserManager = XmlParserManager().initWithURL(data) as! XmlParserManager
    myFeed = myParser.feeds
    feedImgs = myParser.img as [AnyObject]
    
    // 补全feedImgs,保证每个feed条目都有对应的图片项
    while feedImgs.count < myFeed.count {
        feedImgs.append("" as AnyObject) // 用空字符串标记无图片
    }
    
    tableView.reloadData()
}

2. 安全访问图片资源

在cellForRowAt方法中,增加多层安全判断,避免越界和强制解包崩溃:

// Load feed image.
var image: UIImage?
// 先检查索引是否在feedImgs的范围内
if indexPath.row < feedImgs.count {
    // 安全转换类型并判断图片URL是否有效
    if let imageUrlString = feedImgs[indexPath.row] as? String, 
       !imageUrlString.isEmpty, 
       let url = URL(string: imageUrlString) {
        // 这里建议替换成异步加载(见下方优化建议)
        if let data = try? Data(contentsOf: url) {
            image = UIImage(data: data)
        }
    }
}

// 如果没有获取到图片,设置占位图(需要先添加一张占位图到项目中)
if image == nil {
    image = UIImage(named: "placeholder-image") 
}

// 调整图片大小(确保image不为空后再处理)
if let validImage = image {
    image = resizeImage(image: validImage, toTheSize: CGSize(width: 80, height: 80))
}

// 后续设置图片的代码
let cellImageLayer: CALayer? = cell.imageView?.layer
cellImageLayer?.cornerRadius = 35
cellImageLayer?.masksToBounds = true
cell.imageView?.image = image

额外优化建议

  • 不要同步加载图片:当前用Data(contentsOf:)同步加载图片会阻塞主线程,导致tableView滑动卡顿。建议用URLSession异步加载,或者使用成熟的图片库来处理图片缓存和异步加载。
  • 替换AnyObject为具体类型:定义一个FeedItem结构体来存储RSS条目的标题、链接、发布日期、图片URL等信息,避免大量的as!强制转换,让代码更安全易维护。
  • 移除不必要的代理设置:FeedListViewController已经继承了UITableViewController,默认已经设置了dataSource和delegate,不需要在viewDidLoad里重复设置self.tableView.dataSource = self和self.tableView.delegate = self。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 07:29:38