DrWhat
DrWhat

Reputation: 2490

Dictionary does not have a member named filter - but it should, shouldn't it?

I'm trying to get code from github for auto-completion to work, but am stuck with an error on line 6 (data.filter) that Dictionary does not have a member named filter. But everything I read in the documentation suggests dictionaries should have a filter method. I've tried every possible combination of unwrapping, self, etc, but the compiler then registers these changes as the error.

Obviously something is going on that I do not understand - any guidance is appreciated.

var data = Dictionary<String, AnyObject>()    
func applyFilterWithSearchQuery(filter : String) -> Dictionary<String, AnyObject>
{
    var lower = (filter as NSString).lowercaseString
    if (data.count > 0) {
        var filteredData = data.filter ({
            if let match : AnyObject  = $0["DisplayText"]{
                return (match as NSString).lowercaseString.hasPrefix((filter as NSString).lowercaseString)
            }
            else{
                return false
            }
        })
    }
    return filteredData
}

Upvotes: 0

Views: 401

Answers (2)

Antonio
Antonio

Reputation: 72760

Never heard of dictionary filters - where have you read about that? Arrays do have a filter method, but not dictionaries. What you can do is filter keys or values (accessible via the respective dictionary properties).

You can implement a custom filter on a dictionary with the following code:

var filtered = dict.keys.filter { $0.hasPrefix("t") }.map { (key: $0, value: dict[$0]) }

var newDict = [String : AnyObject]()
for element in filtered {
    newDict[element.key] = element.value
}

which filter keys, then maps each key to a (key, value) tuple, then add each tuple to a new dictionary.

Note that to filter keys I used hasPrefix("t") - replace that with something more appropriate to your case

Upvotes: 1

linimin
linimin

Reputation: 6377

var data = Dictionary<String, AnyObject>()

func applyFilterWithSearchQuery(filter: String) -> [String : AnyObject] {
        var lower = filter.lowercaseString

        var filteredData = [String : AnyObject]()

        if (!data.isEmpty) {
                Swift.filter(data) {
                        (key, value) -> Bool in

                        if key == "DisplayText" {
                                filteredData[key] = (value as? String)?.lowercaseString.hasPrefix(lower)
                        }

                        return false
                }

                /* use map function works too
                map(data) {
                        (key, value) -> Void in

                        if key == "DisplayText" {
                                filteredData[key] = (value as? String)?.lowercaseString.hasPrefix(lower)
                        }
                }
                */
        }

        return filteredData
}

Upvotes: 0

Related Questions