【问题标题】:Filter two values in array of objects过滤对象数组中的两个值
【发布时间】:2018-07-05 01:45:19
【问题描述】:

我有一个对象数组,我想通过两个条件过滤它们,如果对象在某个组中,或者如果它具有某个名称,但我不知道为什么它不起作用。

这是我的代码:

let outputfiler = array.filter({$0.group.contains (where: {$0 == "groupBig" }) } || $1.name.contains(where: {$1 == "Eis"})  )

这是我得到的错误:

匿名闭包参数不包含在闭包中

编辑: 组是一个字符串数组, 命名只是一个字符串。

我也试过这个:

outputfiler = array.filter{$0.group.contains (where: {$0 == "groupBig" }) || $0.name(where: {$0 == "Eis"}) }

然后我得到这个错误:

Extraneous argument label 'where:' in call

【问题讨论】:

  • 过滤器采用单个闭包,闭包内可以有多个布尔表达式。因此,首先确保您的 array.filter 后跟 { 而不是 (.
  • 我做了您建议的更改,但不起作用
  • 如果名称是String 属性,$0.name(where:) 没有任何意义。您是否尝试测试是否包含子字符串“Eis”或等于“Eis”?在后一种情况下,使用array.filter{ $0.group.contains("groupBig") || $0.name == "Eis" }。在前者中,contains(where:) 仅处理 Character,因此您需要不同的 API

标签: arrays swift filter contains


【解决方案1】:

您需要如下过滤器(为清楚起见,在多行中显示):

let outputfiler = array.filter({
    $0.group.contains(where: { $0 == "groupBig" }) || 
    $0.name.contains("Eis")
})

您在|| 之前关闭了过滤器}。并假设nameStringcontains 只需要搜索字符串,而不是闭包。

【讨论】:

  • 我试过了,但 xcode 告诉我“调用中的多余参数标签 'where:'”我应该删除第二个“where”。
  • nameString 还是 String 的数组?请参阅假定它是 String 而不是数组的更新。
  • 是的,谢谢对不起我的错,是的,组是一个字符串数组,只是一个字符串。现在可以了,再次感谢
【解决方案2】:

这个语法应该可以工作。

let outputfiler = array.filter{$0.group.contains("groupBig") || $0.name.contains("Eis")}

【讨论】:

    【解决方案3】:

    这是我在 Swift 5 中的解决方案(示例??????):

    我的结构(我使用这个结构从 Firebase 中提取数据):

    struct User { 
    
        let uid:String
        let phoneNumber:String
        let username:String
        let email:String
    
        init(uid:String, dictionary: [String: Any]) {
            self.uid = uid
            self.username = dictionary["username"] as? String ?? String()
            self.phoneNumber = dictionary["phoneNumber"] as? String ?? String()
            self.email = dictionary["email"] as? String ?? String()
    
        }
    
    }
    

    过滤器:

    let arrayFiltered =  self.arrayUsers.filter { (user) -> Bool in
        return user.username.lowercased().contains("Dani".lowercased()) ||
               user.email.lowercased().contains("DanielXXXX@gmail.com".lowercased()) ||
               user.phoneNumber.lowercased().contains("+34111223344".lowercased())
    
    }
    

    祝你有美好的一天♥️。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-02-17
      • 2022-11-27
      • 2019-05-13
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多