Подтвердить что ты не робот

Swift-фильтр объектов

class book{
    var nameOfBook: String!
}

var englishBooks=[book(),book(),book()]
var arr = englishBooks.filter {
    contains($0.nameOfBook, "rt")
}

Я использую этот фильтр, но с ошибкой нельзя вызвать фильтр с аргументом

4b9b3361

Ответ 1

contains() проверяет, содержит ли последовательность данный элемент, например. если a String содержит заданный Character.

Если вы намерены найти все книги, в которых имя содержит подстроку "rt", вы можете использовать rangeOfString():

var arr = englishBooks.filter {
    $0.nameOfBook.rangeOfString("rt") != nil
}

или для нечувствительности к регистру:

var arr = englishBooks.filter {
    $0.nameOfBook.rangeOfString("rt", options: .CaseInsensitiveSearch) != nil
}

В Swift 2, вы можете использовать

nameOfBook.containsString("rt") // or
nameOfBook.localizedCaseInsensitiveContainsString("rt")

и в Swift 3 это

nameOfBook.contains("rt") // or
nameOfBook.localizedStandardContains("rt") // or
nameOfBook.range(of: "rt", options: .caseInsensitive) != nil

Ответ 2

Извините, это старый поток. Измените код немного, чтобы правильно инициализировать переменную 'nameOfBook'.

class book{
   var nameOfBook: String!
   init(name: String) {
      nameOfBook = name
   }
}

Затем мы можем создать массив книг.

var englishBooks = [book(name: "Big Nose"), book(name: "English Future 
Prime Minister"), book(name: "Phenomenon")]

Функция "фильтр" массива принимает один аргумент, а некоторые логики, функция "содержит" может принимать простейшую форму строки, которую вы ищете.

let list1 = englishBooks.filter { (name) -> Bool in
   name.contains("English")
}

Затем вы можете распечатать list1 следующим образом:

let list2 = arr1.map({ (book) -> String in
   return book.nameOfBook
})
print(list2)

// print ["English Future Prime Minister"]

Выше двух фрагментов можно написать короткую руку следующим образом:

let list3 = englishBooks.filter{ ($0.nameOfBook.contains("English")) }
print(list3.map({"\($0.nameOfBook!)"}))

Ответ 3

SWIFT 4.0

Чтобы отфильтровать объекты и получить результирующий массив, вы можете использовать этот

self.resultArray = self.upcomingAuctions.filter {
                    $0.auctionStatus == "waiting"
                }

Ответ 4

в случае, если вы хотите удалить интервал объекта, который имеет конкретные идентификаторы (matchIDsToDelete) из массива объектов (совпадений)

var matches = [Match]
var matchIDsToDelete = [String]
matches = matches.filter { !matchIDsToDelete.contains($0.matchID) }

Ответ 5

В Swift 4.2 используйте функциональность remove(where:). filter плохо справляется с памятью, remove(where:) справляется с работой лучше.

Чтобы делать то, что вы хотите:

englishBooks.removeAll { !$0.nameOfBook.contains("English") }

Ответ 6

Я думаю, что это более полезно из-за отсутствия неправильного набора текста.

englishBooks.filter( { $0. nameOfBook.range(of: searchText, options: .caseInsensitive) != nil}