我正在尝试从表视图中显示的公共静态数组中删除一个项目。删除发生在不同的视图控制器中,当我尝试进入该视图控制器时,应用程序崩溃并显示"索引超出范围"错误
这是我删除项目的地方
func removeItem (info:Dictionary<String, Any>){
let stringKey = info[KEYS.stringKey] as! String
for var i in 0 ..< ItemsViewController.itemVideosList.count {
let current = ItemsViewController.itemVideosList[i]
let currentStringKey = current[KEYS.stringKey] as! String
if stringKey == currentStringKey {
ItemsViewController.itemVideosList.remove(at: i)
return
}
}
我在按钮上调用此方法单击此处:
@IBAction func FavoriteAction(_ sender: Any) {
if Flag {
removeFromFavorite(info: songInfo)
Flag = false
}
else {
ItemsViewController.itemVideosList.insert(songInfo, at: 0)
favFlag = true
}
}
我正在使用此方法填充"项目视图控制器"视图中的表视图DidLoad
func loadItems() {
DispatchQueue.main.async {
self.itemsTableView.reloadData()
}
}
谢谢
您正在尝试在删除时循环访问。这会导致 ItemsViewController.itemVideosList.count 在您删除后无效。
-
您只需添加中断而不是返回即可解决问题
if stringKey == currentStringKey { ItemsViewController.itemVideosList.remove(at: i) return }
-
更重要的是,不应在迭代集合时修改集合。这会导致不良的副作用。最好只存储 indexToDelete,然后在循环之外删除它。
func removeItem (info:Dictionary<String, Any>){ let indexToRemove = -1 let stringKey = info[KEYS.stringKey] as! String for var i in 0 ..< ItemsViewController.itemVideosList.count { let current = ItemsViewController.itemVideosList[i] let currentStringKey = current[KEYS.stringKey] as! String if stringKey == currentStringKey { indexToDelete = i break } } ItemsViewController.itemVideosList.remove(at: indexToDelete) }
注意:
您可以使用高阶函数使迭代更简洁,如下所示:
var list = ["a", "b", "c"]
let index = list.index { (str) -> Bool in
if str == "b" {
return true
}
return false
}