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

