我必须过滤文本字段中包含我的文本的字典。
var arrayData = [["Name":"Sahil"],["Name":"Raman"],["Name":"ashish"],["Name":"Vishnu"],["Name":"Deep"],["Name":"sahil"],["Name":"Swift"]]
//my result should be like this
[["Name":"Sahil"],["Name":"ashish"],["Name":"Vishnu"],["Name":"Swift"]]
不清楚,您稍后在评论中对此进行了解释,但您希望保留键
"Name"
的值,其中包含“s”不区分大小写。
让我们添加几个附加值来显示您之前的尝试失败的原因:
var arrayData = [["Name":"Sahil"],
["Name":"Raman"],
["Name":"ashish"],
["Name":"Vishnu"],
["Name":"Deep"],
["Name":"sahil"],
["Name":"Swift"],
["Name":"s"],
["Name":"S"]]
并简化:
let searchText = "s" // textField.text ?? ""
您尝试过:
let filteredArray1 = arrayData.filter { $0["Name"] == searchText }
print(filteredArray1)
输出:
$> [["Name": "s"]]
所以,只有当 value 恰好等于
"s"
时,你才会得到,这是正常的,你正在使用 ==
然后您尝试:
let filteredArray2 = arrayData.filter { $0["Name"]!.contains(searchText) }
print(filteredArray2)
输出:
$>[["Name": "ashish"], ["Name": "Vishnu"], ["Name": "sahil"], ["Name": "s"]]
所以,当它里面有
"s"
时,你就会得到任何值。差不多就是这样,但是当它有一个大写的 "S"
时你就看不到了。
为此,您可以使用 range(of:options:searchRange:local:)
和 .caseInsensitive
选项。如果结果不是nil
,就说明已经找到了。
所以你可以使用:
let filteredArray3 = arrayData.filter { $0["Name"]?.range(of: "s", options: .caseInsensitive) != nil }
print(filteredArray3)
输出:
$>[["Name": "Sahil"], ["Name": "ashish"], ["Name": "Vishnu"], ["Name": "sahil"], ["Name": "Swift"], ["Name": "s"], ["Name": "S"]]
这应该有效:
var arrayDataFiltered = arrayData.filter { $0["Name"]?.lowercased().contains("s") ?? false }
这里是过滤的文档: https://developer.apple.com/documentation/swift/sequence/3018365-filter