Как отфильтровать массив объектов с помощью NSPredicate? - PullRequest
0 голосов
/ 19 апреля 2020

Как я могу отфильтровать массив объектов, используя NSPredicate?

Я нашел похожий вопрос с ответом здесь ( Как отфильтровать массив с помощью NSPredicate в swift 3 ) Но он не использует NSPredicate.

class Person {
    let firstName: String
    let lastName: String
    let age: Int

    init(firstName: String, lastName: String, age: Int) {
        self.firstName = firstName
        self.lastName = lastName
        self.age = age
    }

    var description: String {
        return "\(firstName) \(lastName)"
    }
}

let alice = Person(firstName: "Alice", lastName: "Smith", age: 24)
let bob = Person(firstName: "Bob", lastName: "Jones", age: 27)
let charlie = Person(firstName: "Charlie", lastName: "Smith", age: 33)
let quentin = Person(firstName: "Quentin", lastName: "Alberts", age: 31)
let people = [alice, bob, charlie, quentin]

let bobPredicate = NSPredicate(format: "firstName = 'Bob'")
let smithPredicate = NSPredicate(format: "lastName = %@", "Smith")
let thirtiesPredicate = NSPredicate(format: "age >= 30")

Я пытался использовать это. Но это дает мне ошибку выполнения.

let filteredBob = (people as NSArray).filtered(using: bobPredicate)

1 Ответ

0 голосов
/ 20 апреля 2020

Проблема в том, что в вашем коде Person - это чистый класс Swift. NSPredicate зависит от времени выполнения Objective- C, поэтому для его использования необходимо сделать свойства, по которым вы фильтруете, доступными для Objective- C, например,

class Person: NSObject {
    @objc let firstName: String
    ...

После этого вы может использовать предикат NSPredicate(format: "firstName = 'Bob'") для массива Person объектов.

...