首页 > 解决方案 > 在“过滤器”之后或通过查找“包含”的“firstIndex”从数组中快速删除项目

问题描述

我有两个Books数组

var tempArray = [Book]()
var filteredArray = [Book]()

在哪里

struct Book: Codable, Equatable {
    let category: String
    let title: String
    let author: String
}

tempArray如果title匹配,我想从中删除一本书。我可以像这样过滤tempArray搜索"Some title"

filteredArray = tempArray.filter( { $0.title.range(of: "Some Title", options: .caseInsensitive) != nil } )

我正在尝试删除

if let i = tempArray.firstIndex(of: { $0.title.contains("Some Title") }) {
        tempArray.remove(at: i)
    }

但得到这个Cannot invoke 'contains' with an argument list of type '(String)'。修复此错误的建议?或者,可以在过滤时删除元素吗?

标签: iosarraysswiftfilterequatable

解决方案


您使用了错误的方法。它应该func firstIndex(where predicate: (Self.Element) throws -> Bool) rethrows -> Self.Index?代替func firstIndex(of element: Book) -> Int?

if let i = tempArray.firstIndex(where: { $0.title.contains("Some Title") }) {
    tempArray.remove(at: i)
}

另一种选择是使用RangeReplaceableCollection's 方法mutating func removeAll(where shouldBeRemoved: (Book) throws -> Bool) rethrows

tempArray.removeAll { $0.title.contains("Some Title") }

游乐场测试:

struct Book: Codable, Equatable {
    let category, title, author: String
}

var tempArray: [Book] = [.init(category: "", title: "Some Title", author: "")]
print(tempArray)   // "[__lldb_expr_12.Book(category: "", title: "Some Title", author: "")]\n"

tempArray.removeAll { $0.title.contains("Some Title") }
print(tempArray)  //  "[]\n"

推荐阅读