Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Sort Dictionary Alphabetically Cannot assign value of type '[(key: String, value: AnyObject)]' to type 'Dictionary<String, AnyObject>?'

Tags:

swift

I have this Dictionary, which I am getting from a web service:

let json = try JSONSerialization.jsonObject(with: data!, options:.allowFragments) as! Dictionary<String, AnyObject>

and now I am trying to sort them alphabetically like so:

self.appDelegate.communityArray = json.sorted(by: {$0.0 < $1.0})

But I get this error:

Cannot assign value of type '[(key: String, value: AnyObject)]' to type 'Dictionary?'

What am I doing wrong?

This is how I am defining communityArray:

var communityArray: Dictionary<String, AnyObject>?
like image 402
user979331 Avatar asked Jul 27 '18 15:07

user979331


People also ask

Can we sort dictionary in Python?

Well, as of python 3.7, dictionaries remember the order of items inserted as well. Thus we are also able to sort dictionaries using python's built-in sorted() function. Just like with other iterables, we can sort dictionaries based on different criteria depending on the key argument of the sorted() function.

How do you sort a map in Python?

Python's sorted() function can be used to sort dictionaries by key, which allows for a custom sorting method. sorted() takes three arguments: object, key, and reverse. Dictionaries are unordered data structures. They use a mapping structure to store data.


1 Answers

As mentioned in the comments a dictionary – a collection type containing key-value pairs – is unordered by definition, it cannot be sorted.

The sorted function of collection applied to a dictionary treats the dictionary for example

["foo" : 1, "bar" : false]

as an array of tuples

[(key : "foo", value : 1), (key : "bar", value : false)]

and sorts them by key (.0) or value (.1) (I suspect sorting by value Any will raise a compiler error)

The error occurs because you cannot assign an array of tuples to a variable declared as dictionary. That's almost the literal error message.

As a compromise I recommend to map the dictionary to a custom struct (similar to a tuple but better to handle)

struct Community {
    let key : String
    let value : Any
}

Your variable name already implies that you want a real array

var communityArray = [Community]()

let json = try JSONSerialization.jsonObject(with: data!) as! Dictionary<String, Any>
communityArray = json.map { Community(key: $0.0, value: $0.1 }.sorted { $0.key < $1.key } 
like image 176
vadian Avatar answered Nov 01 '22 09:11

vadian