Не удается присвоить значение типа ‘Массив<Словарь>’ типу ‘[MyVC.Objects]’

#ios #swift #uitextfield #searchbar

#iOS #swift #uitextfield #панель поиска

Вопрос:

Я пытаюсь использовать текстовое поле в качестве строки поиска для моего табличного представления. Итак, я добавил приведенный ниже код. Теперь он показывает некоторую ошибку, например

Cannot assign value of type 'Array<Dictionary<String, String>>' to type '[MyVC.Objects]'

 var objectArray = [Objects]()
var SearchedobjectArray = [Objects]()

 override func viewDidLoad() {
        super.viewDidLoad()
 SearchedobjectArray = objectArray

}

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.name CONTAINS[cd] %@", search)
        let arr=(objectArray as NSArray).filtered(using: predicate)

        if arr.count > 0
        {
            SearchedobjectArray.removeAll(keepingCapacity: true)
            SearchedobjectArray = arr as! Array<Dictionary<String,String>>
        }
        else
        {
            SearchedobjectArray=objectArray
        }
        looTable.reloadData()
        return true
    }
  

Ошибка здесь :

SearchedobjectArray = arr as! Array<Dictionary<String,String>> Я знаю это, я не использую как Array<Dictionary<String,String> . Но вот как я могу добавить как мой onject, я не уверен.

Любая помощь по этому поводу?

Комментарии:

1. Я не уверен, что за странное приведение вы пытаетесь, но то, что вы пытаетесь сделать, может быть реализовано с помощью SearchedobjectArray = objectArray.filter { $0.name.range(of: search, options: [.diacriticInsensitive, .caseInsensitive]) != nil } . Нет необходимости в NSPredicate , NSArray или if-else.

2. но мой objectArray содержит только looName, id… Поэтому, если ввести любое имя, содержащее looName..it необходимо отобразить в табличном виде

Ответ №1:

Быстрое исправление:

 SearchedobjectArray = arr as! [Objects]
  

Ваш массив не состоит из словарей.

Реальное исправление:

Забудьте NSArray и NSPredicate и используйте фильтрацию swift:

 SearchedobjectArray = objectArray.filter {
    $0.name.range(of: search, options: [.diacriticInsensitive, .caseInsensitive]) != nil
}

if SearchedobjectArray.isEmpty {
    SearchedobjectArray = objectArray
}