在 Swift 中使用数组扩展来按值删除对象

swiftserver side programmingprogramming更新于 2025/9/23 10:15:00

要从 Swift 中的数组中按值删除对象,您可以创建数组类型的扩展。然后,您可以调用以要删除的值作为参数的函数。在本文中,我们将使用过滤器函数在 Swift 语言中使用按值传递的对象来删除对象。让我们看一些如何通过值从数组中消除对象的示例

示例 1:使用过滤函数删除对象

您可以使用内置的过滤方法创建一个没有匹配值的新数组。

算法

  • 步骤 1 - 创建数组的扩展

  • 步骤 2 - 使用 where 子句将元素类型定义为 Equatable

  • 步骤 3 - 通过将元素作为参数来定义一个名为 remove(:) 的函数

  • 步骤 4 - 使用过滤函数过滤掉不包括参数的元素

示例

import Foundation
extension Array where Element: Equatable {
   mutating func remove(_ element: Element) {
      self = filter { $0 != element }
   }
}
var numbers = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
print("原始数组: \(numbers)")
numbers.remove(3)
print("修改后的数组: \(numbers)")

输出

原始数组:[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
修改后的数组:[0, 1, 2, 4, 5, 6, 7, 8, 9]

请记住,remove 函数可以更改初始数组,因为它被指定为修改。在此例中,它用新数组替换省略了请求值的旧数组。

示例 2:使用过滤函数删除自定义结构体对象

在此示例中,我们将使用以下步骤从数组中删除自定义对象(例如结构体)。

算法

  • 步骤 1 - 创建数组扩展

  • 步骤 2 - 使用 where 子句将元素类型定义为 Equatable

  • 步骤 3 - 通过将元素作为参数来定义一个名为 remove(:) 的函数

  • 步骤 4 - 使用过滤函数过滤掉不包括参数的元素

import Foundation
extension Array where Element: Equatable {
   mutating func remove(_ element: Element) {
      self = filter { $0 != element }
   }
}
struct Person: Equatable {
   let name: String
   let age: Int
}
var people = [
   Person(name: "Alice", age: 30),
   Person(name: "Bob", age: 25),
   Person(name: "Charlie", age: 35),
   Person(name: "Dave", age: 20)
]
print("原始数组计数: \(people.count)")

// 删除具有特定姓名和年龄的人
let personToRemove = Person(name: "Bob", age: 25)
print("删除人: \(personToRemove)")
people.remove(personToRemove)
print("修改后的数组计数: \(people.count)")

输出如下

原始数组计数:4
删除人:Person(name: "Bob", age: 25)
修改后的数组计数:3

在创建扩展以及名为"remove"的方法并符合 Equatable 协议后,我们将删除名为"personToRemove"且年龄为"25"的对象。该人符合 Equatable 协议,因此扩展知道如何比较对象并在对象之间找到匹配项时将其删除。

结论

总之,向 Swift Array 类型添加扩展是扩展语言潜力的有效方法。我们可以根据任何条件从数组中删除对象,方法是开发一个扩展,为包含 Equatable 成员的数组提供 remove 方法。这为我们在定义删除标准和可以删除的内容时提供了很大的灵活性。

插件使用内置过滤器技术创建一个没有匹配值的新数组。我们必须将删除方法指定为变异,以允许它影响初始数组,因为我们正在生成一个新数组,而不是更改已经存在的数组。



相关文章



关于我们 | 隐私条款 | 学习路线
返回顶部