Home > Enterprise >  Cannot assign value of type '[String]' to type '[[String : Any]]'
Cannot assign value of type '[String]' to type '[[String : Any]]'

Time:04-08

Swift Xcode version 13.2.1

Here we have two Arrays,(1)var dicSearch=String and (2)var searchingDic: [[String: Any]]=[] I want to assign searchingDic to dicSearch when i implement it than it show error like, Cannot assign value of type '[String]' to type '[[String : Any]]' here's my code, please anyone help!

func searchBar(_ searchBar: UISearchBar, textDidChange searchText: String) {
        searchingDic = dicSearch.filter{filtering in
            let filterService = filtering["fName"] as? String
            return((filterService?.lowercased().contains(searchText.lowercased()))!)
        }
     

CodePudding user response:

It looks like you are trying to create a filtered list based on a search term, but your dicSearch type is an array of strings (i.e: [String]), while your searchingDic is an array of dictionaries (i.e: [[String : Any]]).

This might be confusing when coming from a different language, but in Swift, the following declaration is a dictionary:

var dict: [String: Any] = [
    "key1": "value1",
    "key2": "value2",
]

so the following:

var arrayOfdicts: [[String: Any]] = [
  ["foo": "bar"],
  ["apples": "oranges"],
  dict
]

is actually an array, containing a list of dictionaries, notice how I've put the dict declared above in the second array.

The compiler is telling you that you cannot assign a '[String]' to type '[[String : Any]]'

because this:

// example to an array of strings 
var fullList: [String] = [
    "apples",
    "bananas",
    "cucumbers"
]

// is not the same as 
var arrayOfdicts: [[String: Any]] = [
  ["foo": "bar"],
  ["apples": "oranges"],
  dict
]

The Array#filter method, iterates the array itself, and returns a new array with only the elements that return true in the return statement.

so either both your arrays need to be [String] or both your arrays need to be [[String:Any]]

example for String arrays:


// array
var fullList: [String] = [
    "apples",
    "bananas",
    "cucumbers"
]


var filteredList: [String] = []


var searchTerm = "b"

filteredList = fullList.filter{ item in
  let value = item
  return value.lowercased().contains(searchTerm)
}

print(filteredList) // prints ["bananas", "cucumbers"]

an example for filtering with array of dictionaries:

var people: [[String: Any]] = [
    ["name": "Joe"],
    ["name": "Sam"],
    ["name": "Natalie"],
    ["name": "Eve"]
]


var filteredPeople: [[String: Any]] = []

var nameFilter = "a"

filteredPeople = people.filter{ item in
  let value = item["name"] as! String
  return value.lowercased().contains(nameFilter)
}

print(filteredPeople) // prints [["name": "Sam"], ["name": "Natalie"]]

Hope this helps :)

  • Related