Andrew
Andrew

Reputation: 7873

AnyObject to Array?

I'm using NSJSONSerialization as so:

let twData: AnyObject? = NSJSONSerialization.JSONObjectWithData(responseData, options: NSJSONReadingOptions.MutableLeaves, error: &dataError)

This gives me an AnyObject?.

From here, I want to convert it to Array<Dictionary<String,String>>

I've tried all sorts, leading up to this:

var twDataArray: Array<Dictionary<String,String>>? = twData? as? Array<Dictionary<String,String>>

which simply gives the error:

Type 'Array>' does not conform to protocol 'AnyObject'.

And putting the simpler version:

var twDataArray = twData as Array

gives the error:

Cannot convert the expression's type 'AnyObject?' to type 'Array'

Upvotes: 32

Views: 24971

Answers (5)

Ankit Tiwari
Ankit Tiwari

Reputation: 1

let twData: Any = NSJSONSerialization.JSONObjectWithData(responseData, options: NSJSONReadingOptions.MutableLeaves, error: &dataError)

Do not use AnyObject. Use Any instead of AnyObject. It will work fine. AnyObject is for all reference type and Array is a value type. That's why this comes. Change it to Any.

Upvotes: 0

Mahesh S
Mahesh S

Reputation: 329

As you already know it is a String type you are inserting to something transformable, please do:

if let twoDataArray = twData as? Array<Dictionary<String, String>>{
   for data in twoDataArray{
       print(data)
   }
}

This will guard you from a crashing app when the dictionary is not of type <String,String>.

Upvotes: -1

Vatsal
Vatsal

Reputation: 18171

To cast your data to an array:

var twDataArray = (twData as! NSArray) as Array

The code above first casts twData to an NSArray, and then to an Array via a bridging cast. A bridging cast is a special type of cast which converts an Objective-C type to it's _ObjectiveCBridgeable conformant, Swift counterpart.

(Note that I didn't need to write Array<AnyObject> because the element AnyObject is inferred in the bridging cast from NSArrayArray)

Note that the cast above is a forced downcast. Only use this if you're absolutely sure that twData is going to be an instance of NSArray. Otherwise, use an optional cast.

var twDataArray = (twData as? NSArray) as Array?

Upvotes: 31

arango_86
arango_86

Reputation: 4425

Try the following, you can iterate through the array as given below.

for element in twData as! Array<AnyObject> {
    print(element)
}

Upvotes: 2

Antonio
Antonio

Reputation: 72750

This works in a playground:

var data: Array<Dictionary<String,String>>? = twData as? Array<Dictionary<String, String>>

the difference from your code is that twData does not require the ? at the end - it is an optional so the as? operator will take care of verifying that it can be case to an array of dictionaries - needless to say, if it's nil, as? will evaluate to nil

Upvotes: 1

Related Questions