我们如何在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
}
答案 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
}
}