этот класс не совместим со значением ключа для имени ключа или любых значений, которые я даю в своем коде - PullRequest
0 голосов
/ 04 апреля 2019

Я пытаюсь использовать текстовое поле в качестве панели поиска.Я добавил все методы делагата.Но когда я начинаю набирать любую букву в своем текстовом поле, происходит сбой, например:

этот класс не соответствует значению ключа, кодирующему имя ключа.

Мой объект содержит(т.е. я пытаюсь заполнить данные в моем представлении tabke)

{
"lo_name" = "yourData"
}

Мой код:

 func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool
    {
        if string.isEmpty
        {
            search = String(search.characters.dropLast())
        }
        else
        {
            search=textField.text!+string
        }

        print(search)
        let predicate=NSPredicate(format: "SELF.lo_name CONTAINS[cd] %@", search)
        let arr=(objectArray as NSArray).filtered(using: predicate)

        if arr.count > 0
        {
            SearchedobjectArray.removeAll(keepingCapacity: true)
            SearchedobjectArray = arr as! [MyLooVC.Objects]
        }
        else
        {
            SearchedobjectArray=objectArray
        }
        looTable.reloadData()
        return true
    }

Я попытался дать, как показано ниже:

1.let predicate=NSPredicate(format: "SELF.loo_name CONTAINS[cd] %@", search)

2.let predicate=NSPredicate(format: "SELF.name CONTAINS[cd] %@", search)

Но ничего не добивается успеха.Все еще получаю ту же аварию.Любое решение?

Спасибо

1 Ответ

0 голосов
/ 04 апреля 2019

Я считаю, что ваш массив данных выглядит так:

[
 {
  "lo_name" = "yourData1"
 },
 {
  "lo_name" = "yourData2"
 }
]

Вы должны использовать массив типа swift, а не NSArray, поэтому ваш objectArray будет выглядеть так:

    let objectArray: [[String: Any]]? 
    let objectArray: [[String: String]]? // if all values are string type

И вы должны фильтровать массив как:

    let arr = objectArray?.filter({ ($0["lo_name"] as? String)?.contains(search) ?? false })

    let arr = objectArray?.filter({ $0["lo_name"]?.contains(search) ?? false }) // It all values in dictionary are string type

Для массива структуры:

    struct Objects { 
        var looId : String?
        var looName : String?
    }
    let objectArray = [Objects]()
    // filter it like
    let arr = objectArray.filter({ $0.looName?.contains(search) ?? false })
...