Фильтр не работает в модельном объекте - swift - PullRequest
0 голосов
/ 11 октября 2018

В основном мой объект модели содержит другой объект модели, и я хочу найти / отфильтровать модель, которая находится внутри основного объекта модели, пожалуйста, проверьте ниже для получения дополнительных разъяснений.

struct User {
    var name: String!
    var age: Int!
    var hasPet: Bool!
    var pets: [Pets]!
}

struct Pets {
    var id: Int!
    var petName: String!
    var colour: String!
}

Здесь, когда мой окончательный объект моделисозданный в этой модели, я хочу фильтр, который должен фильтровать основную модель в зависимости от того, какое имя питомца вводит пользователь.

Например, если у одного пользователя в модели есть 2 питомца, один с черным цветом, а второй с белым.Тогда у второго пользователя в модели есть 2 питомца, один с серым цветом и один с коричневым.

Теперь, когда пользователь ищет пользователей, у которых есть белый цвет, они могут появиться в списке.Как и в этом случае список покажет первый пользователь.вот так.

Я попробовал приведенный ниже код, но он не работает: *

let petsFiltered = users.filter { (user) -> Bool in
    return (user.pets.)!
}

Заранее спасибо!

Ответы [ 3 ]

0 голосов
/ 12 октября 2018

Ваши строения:

struct User {
    var name: String
    var age: Int
    var hasPet: Bool
    var pets: [Pet]
}

struct Pet {
    var id: Int
    var petName: String
    var colour: String
}

Объекты пользователя и домашних животных:

 let pet1 = Pet(id: 1, petName: "Lucy", colour: "black, white")
 let pet2 = Pet(id: 2, petName: "Nemo", colour: "white")
 let pet3 = Pet(id: 3, petName: "Scooby-Doo", colour: "white")
 let pet4 = Pet(id: 4, petName: "Garfield", colour: "brown, whiteerktjdfg")

 let user1 = User(name: "Joe", age: 20, hasPet: true, pets: [pet1, pet2])
 let user2 = User(name: "Sophia", age: 30, hasPet: true, pets: [pet3, pet4])

 let users = [user1, user2]

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

    let whitePets = users.compactMap{user -> (User?) in
        var userWithWhitePets = user
        let pets = userWithWhitePets.pets.filter{$0.colour.contains("white")}
        userWithWhitePets.pets = pets
        return userWithWhitePets.pets.count > 0 ? userWithWhitePets : nil

    }

Надеюсь, это поможет вам:)

0 голосов
/ 12 октября 2018

Думаю, будет лучше, если вы также используете вычисляемое свойство для hasPet.

Если нет, каждый раз, когда вы добавляете в массив первого питомца или удаляете из него все элементы, вам также необходимообновление var hasPet: Bool.

 var hasPet: Bool{
    return pets.count > 0
}
0 голосов
/ 11 октября 2018

На основании комментариев.Вам нужно использовать «домашние животные», такие как массив, вместо словаря и проверить цвет .Примерно так:

let usersFiltered = users.filter { (user) -> Bool in
    return user.pets.contains(where: { $0.colour == "white" })
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...