Как реализовать умный поиск контактов по имени и номеру по T9 в iOS?

Я работаю над приложением контактов, и мне было интересно, можно ли искать контакты, как это делают дилеры T9 (буквы, связанные с каждым номером, также фильтруют результаты). Поэтому, если я нажму клавишу 2, она должна искать номер "2", а также "ABC".

Код, который я пытаюсь:

let enteredChar = dialerTextField.text!

        var pattern = keysDictionary?[enteredChar.last]

        pattern = "[\(String(describing: pattern!.first)) - \(String(describing: pattern!.last))]"
        // pattern = "[m-o]" Regex
        do {

            let matches = items.filter({

                (item : String) -> Bool in

                let stringMatch = item.range(of: pattern!, options: .regularExpression, range: nil, locale: nil)

                return stringMatch != nil ? true : false

            })

            let predicate = CNContact.predicateForContacts(matchingName: pattern!)

            let keys = [CNContactGivenNameKey, CNContactFamilyNameKey, CNContactEmailAddressesKey, CNContactPhoneNumbersKey, CNContactImageDataKey, CNContactImageDataAvailableKey]

            var contacts = [CNContact]()
            var message: String!

            let contactsStore = CNContactStore()

            do {
                contacts = try contactsStore.unifiedContacts(matching: predicate, keysToFetch: keys as [CNKeyDescriptor])

                if contacts.count == 0 {
                    message = "No contacts were found matching the given name."
                }
            }
            catch {
                message = "Unable to fetch contacts."
            }


            print("matches : ", contacts)
        }
        catch {

        }

используя приведенный выше код, я могу искать имя контакта, если я изменяю pattern сказать "Роб", но это не работает с Regex "[p-s]", Я хотел бы искать с помощью регулярных выражений. Как это может быть сделано? Спасибо.

2 ответа

Решение

Нет библиотеки, которая бы точно соответствовала вашим потребностям.

Так

Зайдите в свой проект и создайте новый Custom Keyboard Extension для вашего приложения.

Это было в некоторой степени соответствует вашему T9 Клавиатура Tutorial From youtube

Этот учебник YouTube может помочь вам в дальнейшем

Алгоритм использования

Создать словарь, который отображает каждую букву в цифры

подобно {"a":1,"b":1,"c":1,"d":2,.. "z":9}

И извлеките все контакты и выясните последовательность номеров, соответствующих именам контактов (используйте для этого словарь выше).

лайк {"anna":"2662","baby":"2229","denis":"33647","emila":"36452"}

Всякий раз, когда пользователь начинает печатать на клавиатуре, извлекайте все шаблоны, соответствующие приведенному выше словарю. "2" Соответствующие матчи будут "anna" and "baby",

Устраните совпадения, когда получаете больше информации от пользователя.

Создать элементарную реализацию T9 довольно просто, все, что вам нужно сделать, это разобрать контакты в словаре. ключом будет число, а значением будет список контактов.

например, если у вас есть список контактов: Джон, Стэн, Папа, Фэй, вы бы проанализировали его в словаре:

5666 - ["John"]
7826 - ["Stan"]
323 - ["Dad", "Fae"]

когда пользователь вводит цифры, вы просто запрашиваете словарь и либо не показывает результатов, либо соответствует массиву контактов.

Другие вопросы по тегам