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: )
删除最后一个目标元素。