在数组内的自定义对象中搜索字典

时间:2018-12-19 02:30:39

标签: arrays swift filter

我正在构建搜索功能。我有一个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", ""]

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
            }
        }
    }