我正在构建搜索功能。我有一个User对象数组,每个User都有一个标签字典。我正在尝试用搜索标签返回用户。
我的用户类别是:
class User: NSObject {
var name: String?
var tags = Dictionary<String, String>()
}
标记的示例是:
tags: {
“entry1” : “test1”,
“entry2” : “test2”,
“entry3” : “test3”
}
我一直在尝试以下变化:
let predicate = NSPredicate(format: “tags contains[c] %@", “test1”);
let filteredArray = self.usersArray!.filter { predicate.evaluate(with: $0) }; print(“users = ,\(filteredArray)");
它抛出“该类不符合键值的键值编码标准。”我不确定如何在User对象中进行搜索。
更新:
我将字典更改为数组,然后
filter { $0.tags.contains(searchTerm) }
适用于完全匹配的搜索结果,
.filter( {$0.tags.reduce(false, {$1.contains(searchTerm)} )} )
不适用于部分匹配,这就是我要寻找的。
这里是打印的内容:
Search term: ale
Result: []
Tags array inside each object:
["Alex", "Will", ""]
["Bob", "Dan", ""]
["First", "Second", "Third"]
["Testing 1", "Testing 2", ""]
答案 0 :(得分:1)
您的标记实现似乎很麻烦。这是一个简单的。
class User {
var name: String
var tags: [String]
}
现在,假设您在users
中有一组用户。
var users: [User]
// Store users in the array
现在,这是您检查哪个用户包含特定标签的方法。
let tag = "yourTag"
users.filter( { $0.tags.contains(tag) } )
但是,如果您坚持要在词典中使用标签,则可以这样做,
users.filter( {$0.tags.values.contains(tag)} )
如果您想检查标签是否属于特定用户中的任何标签的部分,则可以这样做
let filteredUsers = users.filter( {$0.tags.reduce(false, {$1.contains(tag)} )} )
PS-我们在Swift中不使用;
。
答案 1 :(得分:1)
使模型符合Codeable
是个好习惯:
struct User: Codable {
var userId: UUID
var name: String = ""
var referenceTags: [String: String] = [:]
}
// Create some users:
let Bob = User(userId: UUID(), name: "Bob", referenceTags: ["tag1": "no", "tag2": "yes"])
let Steve = User(userId: UUID(), name: "Steve", referenceTags: ["tag2": "no", "tag3": "no"])
创建要过滤的用户数组。
let users:[User] = [Bob, Steve]
从搜索栏或其他获取搜索谓词或字符串。
let searchPredicate = "yes"
过滤并遍历标记以获取所需的值。
let results = users.filter { (user) -> Bool in
for (key, _) in user.referenceTags.enumerated() {
if (user.referenceTags[key] == searchPredicate) {
return true
}
}
}