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,以允许它影响初始数组。