Swift 中通过值移除数组中的对象


为了通过值从 Swift 中的数组中移除一个对象,您可以为 Array 类型创建一个扩展。然后,您可以调用该函数,该函数将要消除的值作为参数。在本文中,我们将使用 filter 函数通过值在 Swift 语言中移除对象。让我们看一些如何通过值从数组中移除对象的示例。

示例 1:使用 Filter 函数移除对象

您可以使用内置的 filter 方法创建一个不包含匹配值的新数组。

算法

  • 步骤 1 − 为数组创建扩展

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

  • 步骤 3 − 定义一个名为 remove(:) 的函数,并以元素作为参数

  • 步骤 4 − 使用 filter 函数过滤掉除了参数之外的所有元素

示例

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("Original array: \(numbers)")
numbers.remove(3)
print("Modified array: \(numbers)")

输出

Original array: [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
Modified array: [0, 1, 2, 4, 5, 6, 7, 8, 9]

请记住,remove 函数可以更改初始数组,因为它被指定为修改数组。在这种情况下,它用一个新的数组替换旧的数组,该数组省略了请求的值。

示例 2:使用 Filter 函数移除自定义结构体对象

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

算法

  • 步骤 1 − 为数组创建扩展

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

  • 步骤 3 − 定义一个名为 remove(:) 的函数,并以元素作为参数

  • 步骤 4 − 使用 filter 函数过滤掉除了参数之外的所有元素

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("Original array count: \(people.count)")

// Remove a person with a specific name and age
let personToRemove = Person(name: "Bob", age: 25)
print("Removing person: \(personToRemove)")
people.remove(personToRemove)
print("Modified array count: \(people.count)")

以下是输出

Original array count: 4
Removing person: Person(name: "Bob", age: 25)
Modified array count: 3

在创建扩展以及名为“remove”的方法并符合 Equatable 协议后,我们正在移除一个名为“personToRemove”、名称为“Bob”且年龄为“25”的对象。该对象符合 Equatable 协议,因此扩展知道如何比较对象并在对象之间找到匹配项时移除它们。

结论

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

该附加组件使用内置的 filter 技术创建了一个不包含匹配值的新数组。由于我们正在生成一个新数组而不是修改现有的数组,因此我们必须将删除方法指定为 mutating,以允许它影响初始数组。

更新于: 2023年4月4日

719 次查看

开启你的 职业生涯

通过完成课程获得认证

开始学习
广告