我有一系列这样的词典:
var suggestions = [["keyword": "apple", "identifier": "0"], ["keyword": "banana", "identifier": "1"], ["keyword": "carrot", "identifier": "2"]]
我想追加建议数组,在我这样做之前,我想知道字典是否已存在于我的数组中以防止重复。我怎么能在Swift 3中做到这一点?
我尝试使用Swift 3的contains(where: ([String: String)])
函数,但似乎无法使其正常工作。
更新: Daniel Hall的回答让它成功了。这是Swift 3的确切代码:
let newDictionary = ["keyword": "celery", "identifier": "3"]
if !suggestions.contains(where: {$0 == newDictionary}) {
suggestions.append(newDictionary)
}
答案 0 :(得分:7)
我认为解决方案比其他答案建议的更直接。只需使用:
let newDictionary = ["keyword":"celery", "identifier": "3"]
if !suggestions.contains{ $0 == newDictionary } {
suggestions.append(newDictionary)
}
这可以确保您现有的词典数组在添加之前不包含要添加的新词典。
答案 1 :(得分:2)
您可以创建表示数据类型的结构,而不是使用字典,而不是使用字典。
internal struct Entry {
let id: String
let keyword: String
}
extension Entry: Equatable {
static func == (lhs: Entry, rhs: Entry) -> Bool {
return lhs.id == rhs.id && lhs.keyword == rhs.keyword
}
}
let suggestions: [Entry] = [] //...
let newEntry = Entry(id: "3", keyword: "orange")
if suggestions.contains(newEntry) {
// Do Something
} else {
// Insert maybe?
}
如果您只想继续使用字典,可以使用contains
let newEntry = ["keyword": "orange", "identifier": "4"]
let containsEntry = suggestions.contains{ $0["identifier"] == newEntry["identifier"] }
if containsEntry {
// Do something
} else {
// Insert maybe?
}
我会选择struct选项。
答案 2 :(得分:0)
应该像
一样简单suggestions.contains(where:{$0.contains(where:{$0=="keyword" && $1=="carrot"})})
您要检查“关键字”:“胡萝卜”键值对。语法有点麻烦,因为你正在寻找内容。
请注意,以上是完整查询的简写...
suggestions.contains(where:{
(dict: [String:String])->Bool in dict.contains(where:{
(key: String, value: String) -> Bool in (key=="keyword" && value=="carrot")
})
})
对您而言可能会或可能不会更简单。
答案 3 :(得分:0)
另一个好的,直截了当的解决方案,丹尼尔霍尔答案的一个可靠替代方案是:
let contains = suggestions.map(){$0 == newDictionary}.contains(true)
if !contains{
suggestions.append(newDictionary)
}
我发布了这个答案,因为它没有使用contains(where: ([String: String]) throws Bool)
函数。
说明:基本上,suggestions.map(){$0 == newDictionary}
会创建一个[Bool]
,其中每个位置都包含一个Bool
值,用于检查数组的该位置是否位于{{1} }}。然后,newDicitonary
检查newDictionary是否在.contains(true)
数组中的任何位置。