我们如何在Swift中实现此过滤器

时间:2020-10-12 12:56:26

标签: arrays swift dictionary filter

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

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

遇到此错误

无法将类型“ [模型]”的值转换为闭合结果类型 '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
}

1 个答案:

答案 0 :(得分:2)

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

注意:您不应该检查您的字符串计数是否大于零。字符串为此具有一个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
    }
}