Swift 数组里提供了删除数组元素的方法主要包括以下几种:
1、@inlinable public mutating func remove(at index: Int) -> Element 通过索引删除元素,且索引必须是数组有效索引,返回删除所索引元素。
复杂度为 O(n) remove(at index: Int)示例
var measurements: [Double] = [1.1, 1.5, 2.9, 1.2, 1.5, 1.3, 1.2] let removed = measurements.remove(at: 2) print(measurements) // Prints "[1.1, 1.5, 1.2, 1.5, 1.3, 1.2]"
@inlinable public mutating func removeAll(keepingCapacity keepCapacity: Bool = false)
删除数组所有元素 参数keepCapacity 为true保持当前数组容量,默认值为false。
复杂度为O(n)
Swift数组如果要删除某个元素,那么我们有哪些方式呢?
一个简单的方法是我们通过filter直接过滤掉我们需要生成的元素:
let ar = [2, 3, 5, 34] // 生成新数组 let ar2 = ar.filter({0 != 2}) print(ar2) // 过滤未包含元素 let ar3 = ar.filter({0 != 7}) print(ar3) 但是这种方法会生成一个新的数组,如果我们不想生成一个新的数组,还在原来的数组上操作该怎么做呢?
一、使用removeAll(where:) @inlinable public mutating func removeAll(where shouldBeRemoved: (Element) throws -> Bool) rethrows 使用这个方法删除数组中的每一个匹配的元素 复杂度为O(n) removeAll(where:)示例:
删除数组中的奇数
var numbers = [5, 6, 7, 8, 9, 10, 11] numbers.removeAll(where: { $0 % 2 != 0 }) // numbers == [6, 8, 10] 删除数组中的某个元素
var ar = [2, 3, 2, 5, 34] ar.removeAll(where: {$0==2}) // ar = [3, 5, 34] 二、使用remove(at:) 思路大概就是找到需要删除数组索引进行删除,在OC里我们可以通过indexOfObject:方法获取索引,在Swift里我们可以通过以下方法获取索引:
1、index(of:)获取数组里元素出现的第一个索引,但是从Swift5.0开始,这个方法被废弃了。
@inlinable public func index(of element: Element) -> Int? 2、firstIndex(of:)在使用firstIndex(of :)查找特定元素的位置。
@inlinable public func firstIndex(of element: Element) -> Int? firstIndex(of:)使用示例:
var students = ["Ben", "Ivy", "Jordell", "Maxime"] if let i = students.firstIndex(of: "Maxime") { students[i] = "Max" } print(students) // Prints "["Ben", "Ivy", "Jordell", "Max"]" OK,接下来我们来进行对原数组操作进行元素删除:
var ar = [2, 3, 5, 34]
// 原数组操作 // 删除元素 3 if let index = ar.firstIndex(of: 3) { ar.remove(at: index) } // 测试删除未含元素 if let index = ar.firstIndex(of: 6) { ar.remove(at: index) } 写在最后: 使用方法一可以把所有需要删除的元素删除,使用方法二可以删除第一个目标元素。当然也可以使用lastIndex(of: )删除最后一个目标元素。