【问题标题】:How we can achieve this Filter in Swift我们如何在 Swift 中实现这个过滤器
【发布时间】:2021-01-26 19:07:09
【问题描述】:

我们如何在 Swift 中实现这个过滤器。

我有完全相同的问题,我正在尝试这种方式,我找到了this solution on stack overflow 但这是用 Javascript 编写的,我需要 Swift 语言的代码。

收到此错误

无法将“[Model]”类型的值转换为闭包结果类型 'GetModel'

我的代码和模型

extension Array where Element == GetModel{
    func matching(_ text: String?) -> [GetModel] {
        if let text = text, text.count > 0{
            return self.map{
                $0.data.filter{
                     $0.name.lowercased().contains(text.lowercased())
                }
            }
        }else{
            return self
        }
    }
}
// MARK: - GetModel
struct GetModel: Codable {
    let id: Int
    let name: String
    var data: [Model]
}

// MARK: - Model
struct Model:Codable {
    let id: Int
    let name: String
    var isSelected: Bool? = nil
}

【问题讨论】:

  • 你为什么要返回一个不同的类型,即GetModel?为什么不简单地返回一个 Models 数组?
  • 我想返回 [GetModel] 但不知道该怎么做。
  • 另外,GetModel 究竟代表什么?是否保证data 数组中的所有Models 与GetModel 实例本身具有相同的id 和name?
  • 我正在尝试实现搜索功能,例如 Apple 联系人搜索有 A、B、C 等部分,但是当我们尝试搜索时,我们可以看到没有部分的结果

标签: arrays swift dictionary filter


【解决方案1】:

你犯了两个错误。首先您使用的是map,但您应该使用过滤器。其次,当您应该使用contains(where:) 时,您正在使用filter。注意可以。使用localizedStandardCompare 而不是小写你的字符串。

注意:您不应该检查您的字符串计数是否大于零。 String 有一个 isEmpty 属性正是为此目的。

要检查集合是否为空,请使用其 isEmpty 属性 而不是将计数与零进行比较。除非收藏保证 随机访问性能,计算计数可以是 O(n) 操作。

extension RangeReplaceableCollection where Element == GetModel {
    func matching(_ text: String?) -> Self {
        guard let text = text, !text.isEmpty else { return self }
        return filter { $0.data.contains { $0.name.localizedStandardContains(text) } }
    }
}

编辑/更新:

如果您需要过滤您的GetModal 数据:

extension RangeReplaceableCollection where Element == GetModel, Self: MutableCollection {
    func matching(_ text: String?) -> Self {
        guard let text = text, !text.isEmpty else { return self }
        var collection = self
        for index in collection.indices {
            collection[index].data.removeAll { !$0.name.localizedStandardContains(text) }
        }
        collection.removeAll(where: \.data.isEmpty)
        return collection
    }
}

【讨论】:

  • @ZainAnjum 您需要过滤 GetModal 数据吗?目前尚不清楚您是希望 GetModel 对象包含所有数据还是仅包含符合条件的对象
  • 我需要匹配嵌套数组名称的 [GetModel] 数组
猜你喜欢
  • 2018-11-05
  • 1970-01-01
  • 2012-05-12
  • 1970-01-01
  • 2020-10-25
  • 1970-01-01
  • 2014-01-21
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多