Поиск по словарю в пользовательском объекте внутри массива - PullRequest
0 голосов
/ 19 декабря 2018

Я строю функцию поиска.У меня есть массив объектов 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 голосов
/ 19 декабря 2018

Рекомендуется, чтобы ваши модели соответствовали 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
            }
        }
    }
0 голосов
/ 19 декабря 2018

Ваша реализация тегов кажется громоздкой.Вот более простой вариант.

class User {
    var name: String
    var tags: [String]
}

Теперь предположим, что у вас есть массив пользователей в users.

var users: [User]

// Store users in the array

Теперь вы можете проверить, какой пользователь содержит конкретного пользователя.tag.

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.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...