Swift中如何从含重复元素的数组删除指定位置的特定字符串?
解决数组中删除第二个特定元素的问题
你的现有代码里,array.firstIndex(of: fruit)!只会找到第一个匹配元素的索引,所以每次删除的都是第一个"orange",没法直接删除第二个。要实现删除第二个目标元素,可以通过以下两种方式修改代码:
方法一:收集所有匹配索引后选择第二个
这种方式用函数式编程快速获取所有匹配元素的索引,再选择第二个进行删除:
@IBAction func likeButtonAction(_ sender: UIButton) { guard let fruitToCheck = fruit else { return } // 安全解包,避免强制解包崩溃 if array.contains(fruitToCheck) { // 提取所有等于目标元素的索引 let matchingIndices = array.enumerated() .filter { $0.element == fruitToCheck } .map { $0.offset } // 优先删除第二个匹配项,没有的话删除第一个(保持原有逻辑) if let secondIndex = matchingIndices.dropFirst().first { array.remove(at: secondIndex) } else { array.remove(at: matchingIndices.first!) } } else { array.append(fruitToCheck) } UserDefaults.standard.set(array, forKey: "fruit") }
方法二:遍历计数找到第二个匹配项
这种方式更直观,通过遍历数组计数,找到第二次出现目标元素的位置:
@IBAction func likeButtonAction(_ sender: UIButton) { guard let fruitToCheck = fruit else { return } if array.contains(fruitToCheck) { var matchCount = 0 var targetIndex: Int? for (index, element) in array.enumerated() { if element == fruitToCheck { matchCount += 1 if matchCount == 2 { targetIndex = index break // 找到第二个就停止遍历 } } } // 找到第二个索引就删它,否则删第一个 if let index = targetIndex { array.remove(at: index) } else { array.remove(at: array.firstIndex(of: fruitToCheck)!) } } else { array.append(fruitToCheck) } UserDefaults.standard.set(array, forKey: "fruit") }
注意事项
- 代码里加了
guard let解包fruit,避免原代码中强制解包fruit!可能导致的崩溃 - 如果数组中目标元素只有一个,两种方法都会退回到删除第一个元素的逻辑,和你原有代码行为一致
内容的提问来源于stack exchange,提问作者Dian
相关产品推荐
相关产品推荐

