如果您使用 Xcode 10.0+ beta(Swift 4.2 或更高版本)进行编码,您可以使用新方法 removeAll(where:)
mutating func removeAll(where predicate: (Element) throws -> Bool) rethrows
讨论:使用此方法删除集合中的每个元素
符合特定标准的。
复杂度:O(n),其中 n 是集合的长度。
这个例子去掉了所有的奇数
来自数字数组的值:
Swift 5.2 或更高版本
extension BinaryInteger {
var isEven: Bool { isMultiple(of: 2) }
var isOdd: Bool { !isMultiple(of: 2) }
}
var numbers = [5, 6, 7, 8, 9, 10, 11]
numbers.removeAll(where: \.isOdd) // numbers == [6, 8, 10]
numbers
在您的情况下,请确保 MyCustomObject 符合 Equatable
objectArray.removeAll(where: { $0 == objectToRemove })
或使用符合它的属性之一作为谓词(即id: Int):
objectArray.removeAll(where: { $0.id == idToRemove })
注意:如果您不使用 Xcode 10.0+ beta (Swift 4.2),您可以实现自己的 removeAll(where:) 方法,正如您在此 answer 中看到的那样。
实现removeFirst(where:) 和removeLast(where:) 以避免迭代整个集合,正如@vacawama 在 cmets 中提到的那样
斯威夫特 4.1
extension RangeReplaceableCollection {
@discardableResult
mutating func removeFirst(where predicate: (Element) throws -> Bool) rethrows -> Element? {
guard let index = try index(where: predicate) else { return nil }
return remove(at: index)
}
}
extension RangeReplaceableCollection where Self: BidirectionalCollection {
@discardableResult
mutating func removeLast(where predicate: (Element) throws -> Bool) rethrows -> Element? {
guard let index = try indices.reversed().first(where: {
try predicate(self[$0])
}) else { return nil }
return remove(at: index)
}
}
Swift 4.2 或更高版本(由 @Hamish 建议)
extension RangeReplaceableCollection {
@discardableResult
mutating func removeFirst(where predicate: (Element) throws -> Bool) rethrows -> Element? {
guard let index = try firstIndex(where: predicate) else { return nil }
return remove(at: index)
}
}
extension RangeReplaceableCollection where Self: BidirectionalCollection {
@discardableResult
mutating func removeLast(where predicate: (Element) throws -> Bool) rethrows -> Element? {
guard let index = try lastIndex(where: predicate) else { return nil }
return remove(at: index)
}
}
您还可以查看 post 以了解 remove(while:)、removeLast(while:) 和 dropLast(while:) 方法的实现。