swift удалить элемент из массива после `filter` или найдя` firstIndex, который `содержит` - PullRequest
0 голосов
/ 12 июля 2019

У меня есть два массива Book s

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)'.Совет исправить эту ошибку?Или, альтернативно, элемент может быть удален во время фильтрации?

1 Ответ

2 голосов
/ 12 июля 2019

Вы используете неправильный метод.Это должно быть 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 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"
...