Type 'Any' Has no Subscript Members in xcode 8 Swift 3

60,530

Try this:

let json = try JSONSerialization.jsonObject(with: data!, options:.allowFragments) as! [String:AnyObject]

Safe way:

do {
    if let json = try JSONSerialization.jsonObject(with: data!, options:.allowFragments) as? [String:Any] {
        print(json)
    }
} catch let err{
    print(err.localizedDescription)
}

You have to cast type Any to Swift dictionary type [String:AnyObject].

Edit: Swift 3
In swift 3 the purpose of AnyObject is more clarified. So more favourable Swift Dictionary type will be [String:Any].

Any is an alias for any data type.
AnyObject is an alias for any data type derived from a class.

For more info visit: https://craiggrummitt.com/2016/09/16/any-vs-anyobject-vs-nsobject-in-swift-3/

Share:
60,530
Admin
Author by

Admin

Updated on July 10, 2022

Comments

  • Admin
    Admin almost 2 years

    My App is supposed to go to a specific location to pull down the website it needs to load. In 2.3 it worked like a charm, but since I've updated xcode (which I don't have a ton of experience in) it is giving me the error "type 'Any' has no subscript members" and highlighting the "json" right before line three

    ...Retriever = json["WEB"]...
    

    this is the code related to it.

    let json = try JSONSerialization.jsonObject(with: data!, options:.allowFragments)
    
          if let Retriever = json["WEB"] as? [[String: AnyObject]] {
    
                     for website in Retriever {
    
                        if let name = website["URL"] as? String {
    
                              self.loadAddressURL(name)
    

    I feel like I am missing something small. If there is a better way to do this, I would love suggestions. The URL returns this JSON

    {
      "WEB" : [
               {
                "URL" : "http://www.google.com"
               }    
              ]
    }
    

    but I would love it if I could simplify it to just

    {"URL":"http://www.google.com"}
    
  • Admin
    Admin over 7 years
    Worked like a charm, I had to add the "!" after the as but it worked like a charm
  • Abdul Waheed
    Abdul Waheed over 7 years
    Thanks a lot :* You saved me hours of headscratching
  • Bista
    Bista over 7 years
    It will be good if someone can add more relative valuable information to this answer as it is becoming popular. :)