为对象数组

时间:2017-02-16 16:39:07

标签: swift dictionary

我向用户显示一个看起来像联系人视图的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)]]

2 个答案:

答案 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)