【问题标题】:Filter not working in model object - swift过滤器在模型对象中不起作用 - 快速
【发布时间】:2018-10-11 17:07:34
【问题描述】:

基本上我的模型对象包含另一个模型对象,我想从主模型对象内的模型中搜索/过滤,请查看下面的更多说明。

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.)!
}

提前致谢!

【问题讨论】:

  • 定义“不工作”。
  • @rmaddy 是我的描述不足以理解问题吗?
  • 不,一点也不。您首先对数据模型中的内容进行模糊概述。然后,您就用户搜索时应该发生的情况给出一个更不明确的句子。然后你展示一小段代码并简单地声明“不起作用”。该代码究竟以何种方式不起作用?您实际上对petsFiltered 做了什么?您的问题中缺少很多细节。
  • 我不明白。 pets["name"] 这意味着 pets 是一个字典(因为我不认为你在 Pets 上做了下标)。你检查“名字”上的“白色”吗?您的数组名为user,但您将其中的每个变量命名为pet。所以至少应该是{ (anUser) -> Bool in
  • @rmaddy 好的,这可能是因为我第一次发布了问题,从下次开始会处理这个问题。谢谢顺便说一句!

标签: swift


【解决方案1】:

你的结构:

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

    }

希望对你有帮助:)

【讨论】:

    【解决方案2】:

    基于 cmets。您需要使用像数组这样的“宠物”而不是字典并检查颜色。类似的东西:

    let usersFiltered = users.filter { (user) -> Bool in
        return user.pets.contains(where: { $0.colour == "white" })
    }
    

    【讨论】:

      【解决方案3】:

      我认为对 hasPet 使用计算属性会更好。

      如果没有,每次您向数组中添加第一个宠物或从中删除所有元素时,您还需要更新 var hasPet: Bool。

       var hasPet: Bool{
          return pets.count > 0
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-08-03
        • 2021-03-21
        • 1970-01-01
        • 2021-09-12
        • 2013-03-16
        相关资源
        最近更新 更多