【问题标题】:Swift filter a array struct by an array of search wordsSwift 通过搜索词数组过滤数组结构
【发布时间】:2023-01-19 00:25:36
【问题描述】:

我创建了一个数组结构来存放我在列表中使用的值。现在我希望能够搜索此列表,每次用户创建一个空格时,程序都应该将其视为两个不同的搜索词,这两个搜索词都应该满足。 我已经成功地创建了一个函数来获取搜索词,但我真的不知道如何通过所有搜索词过滤我的 stuctArray。

let searchWords = findAllSearchResutsRecursive(searchWord) //example ["A", "B", ,"C"]

let filteredArray = listArray.filter {
    for word in searchWords {
        $0.firstname!.capitalized.contains(word.capitalized) ||
        $0.lastname!.capitalized.contains(word.capitalized) ||
        $0.id!.capitalized.contains(word.capitalized) ||
        $0.city!.capitalized.contains(word.capitalized)
    }
}

澄清一下,如果 searchWords 是 ["A", "N"] 并且参与者之一(列表中的人)的名字是“Anna”,但没有其他匹配搜索我仍然想显示它。

或者,如果将 SearchWords 转换为一个集合并以某种方式同时过滤它们会更好。

这是我得到的错误:

【问题讨论】:

  • 那么你的代码有什么问题?你得到什么错误?什么不起作用?
  • @burnsi 我用截图更新了问题,这样你就可以看到我的错误
  • 过滤器的闭包需要为每个被过滤的元素返回一个布尔值。您的代码在过滤器内有一个 for 循环。 for 循环的主体不能不返回布尔值。您将需要重构您的代码。

标签: ios swift


【解决方案1】:

您可以使用 reduce 方法检查结构的属性中是否存在任何搜索词。以下是如何实现此功能的示例:

let filteredArray = listArray.filter {
    searchWords.reduce(false) {
        $0 ||
        $1.capitalized.contains($1.firstname!.capitalized) ||
        $1.capitalized.contains($1.lastname!.capitalized) ||
        $1.capitalized.contains($1.id!.capitalized) ||
        $1.capitalized.contains($1.city!.capitalized)
    }
}

降低方法接受一个初始值和一个闭包,闭包接受当前结果和数组中的下一个元素,并返回最终结果。在这种情况下,它以 false 作为初始值开始,并检查结构的属性中是否存在任何搜索词。

【讨论】:

  • 我更喜欢你的回答。巧妙地使用reduce()。 (投票)
【解决方案2】:

你可以这样重写它:

let searchWords = findAllSearchResutsRecursive(searchWord) //example ["A", "B", ,"C"]

let filteredArray = listArray.filter {
    var matchFound = false
    for word in searchWords {
        if (
          $0.firstname!.capitalized.contains(word.capitalized) ||
          $0.lastname!.capitalized.contains(word.capitalized) ||
          $0.id!.capitalized.contains(word.capitalized) ||
          $0.city!.capitalized.contains(word.capitalized)
        ) {
            matchFound = true
          }
    }
    return matchFound
}

【讨论】:

    猜你喜欢
    • 2016-10-29
    • 2018-12-25
    • 1970-01-01
    • 2015-12-21
    • 1970-01-01
    • 1970-01-01
    • 2017-02-26
    • 2021-09-13
    相关资源
    最近更新 更多