我向用户显示一个看起来像联系人视图的tableview,因为数据源是[String:[User]]类型的字典,所以我显示了第一个部分标题用户名字母。
现在,我想允许他们按用户的名字进行搜索......但我无法使用此功能。
这些是词典...朋友们会保存这样的数据["A" :[Users whose first name start with an A]]
等等
var friends = [String: [User]]()
var filteredFriends = [String: [User]]()
这是我的过滤代码,searchText
是我想要搜索的第一个名字
self.filteredFriends = self.friends.filter{friend in
return friend.firstName.lowercased().contains(searchText)}
我想要做的是让filteredFriends
拥有用户名以文字开头的friends
的所有值。
如何使用像我这样的词典来完成这项工作?
由于
更多信息:
Class User {
var firstName: String?
init(name: String){
self.firstName = name
}
}
示例场景:
friends = ["A" : [User(name: "Anthony), User(name: "Arnold")], "B" : [User(name: "Barry")]]
filteredFriends = friends
searchText = "an"
所需的filteredFriends(最终结果)= ["A" : [User(name: "Anthony)]]
答案 0 :(得分:1)
没有简单的方法。你只需循环遍历整个字典,如下所示:
// these are your initial conditions
class User {
let firstName: String
init(name: String) {
self.firstName = name
}
}
let friends : [String:[User]] =
["A" : [User(name: "Anthony"), User(name: "Arnold")],
"B" : [User(name: "Barry")]]
let searchText = "an"
// and here we go...
var filteredFriends = [String:[User]]()
for entry in friends {
let filt = entry.value.filter{$0.firstName.lowercased().hasPrefix(searchText)}
if filt.count > 0 {
filteredFriends[entry.key] = filt
}
}
现在filteredFriends
包含所需的结果。
答案 1 :(得分:1)
理想情况下,您可以使用map
将输入字典转换为输出字典,方法是过滤每个值(User
数组)。不幸的是,Dicationary.map
返回[(Key, Value)]
(一个'(Key,Value)元组的数组),而不是一个新的Dictionary。我将采用更传统的迭代方法。
注意:对于那些即将使用各种功能样式的人来说,那些即将建议使用reduce
的人:不。拉出一个分析器,看看用reduce生成字典有多慢和耗电。在电池有限的移动设备上尤为重要。
我将如何做到这一点:
let allFriends = [String: [User]]()
var filteredFriends = [String: [User]]()
let searchText = "a".lowercased()
for (initial, allFriendsWithInitial) in allFriends {
if initial.lowercased() == searchText {
// don't even have to bother filtering `friends`
filteredFriends[initial] = allFriendsWithInitial
}
let filteredFriendsWithInitial = allFriendsWithInitial.filter{
$0.firstName.lowercased().contains(searchText)
}
if !filteredFriendsWithInitial.isEmpty {
filteredFriends[initial] = filteredFriendsWithInitial
}
}
print(filteredFriends)