iOS/Swift中firstIndex指定$0首元素位置及类型报错问题
问题原因
- 类型不匹配:你声明
programArray为[Any]类型,但实际存储的元素是分割后得到的[String]类型子数组,遍历时拿到的$0是Any类型,无法直接和字符串做相等判断,触发类型转换报错。 - 匹配逻辑错误:你的需求是匹配子数组的第一个元素值,不是将整个子数组和目标字符串直接对比。
- 隐藏问题:你要匹配的目标值只有日期,但是子数组第一个元素是带具体时间的完整字符串,直接用
==对比永远匹配不到结果。
修正方案
- 把
programArray的类型明确声明为[[String]],既符合你实际存储的嵌套字符串数组结构,也避免了Any类型的冗余转换问题。 - 写
firstIndex的匹配规则时,先判断子数组不为空,再取子数组的第0位元素和目标值做前缀匹配。 - 对
firstIndex返回的可选值做安全解包,避免找不到对应值时调用remove(at:)崩溃。
完整修正代码
// 明确类型为嵌套字符串数组,不要用Any var programArray: [[String]] = [] let slots: String = "2021-14-09 08:00:00|2021-14-09 09:00:00|ACCUEIL CAFE|Amphi A#2021-14-09 09:00:00|2021-14-09 10:00:00|PLENIERE|Amphi A#2021-14-09 10:00:00|2021-14-09 12:00:00|WORKSHOP|Salle Besse#2021-14-09 12:00:00|2021-14-09 14:00:00|DEJEUNER|Cantine#2021-14-09 14:00:00|2021-14-09 16:00:00|TESTDRIVES|XXX#2021-14-09 16:00:00|2021-14-09 17:00:00|CLOTURE|Amphi A#" //将Slots转换为数组 let stringArray = slots.components(separatedBy: "#") if stringArray.count > 1 { for i in 0..<stringArray.count { let intermediateTwo = stringArray[i] let strinArrayTwo = intermediateTwo.components(separatedBy: "|") if strinArrayTwo.count > 1 { programArray.append(strinArrayTwo) } else { print("not found") } } } else { print("not found") } // 匹配子数组第一个元素的日期前缀,安全解包可选值 if let index = programArray.firstIndex(where: { subArray in // 先判断子数组不为空再取第一个元素,避免越界 guard !subArray.isEmpty else { return false } // 匹配日期前缀,需要完全匹配就把hasPrefix改成== return subArray[0].hasPrefix("2021-14-09") }) { programArray.remove(at: index) } else { print("未找到匹配的日期数据") }
补充优化
如果你的需求是移除所有非目标日期的条目,不要用firstIndex只删第一个,直接用filter过滤数组更方便:
programArray = programArray.filter { subArray in guard !subArray.isEmpty else { return false } // 保留符合日期的条目,反过来写就是移除不符合的 return subArray[0].hasPrefix("2021-14-09") }
内容的提问来源于stack exchange,提问作者ΩlostA
相关产品推荐
相关产品推荐

