stevengbu
stevengbu

Reputation: 243

Swift 3 Value of type 'Any?' has no member 'object'

I have updated swift 3 and I found many errors. This is one of them :

Value of type 'Any?' has no member 'object'

This is my code :

jsonmanager.post( "http://myapi.com",
                      parameters: nil,
                      success: { (operation: AFHTTPRequestOperation?,responseObject: Any?) in
                        if(((responseObject? as AnyObject).object(forKey: "meta") as AnyObject).object(forKey: "status")?.intValue == 200 && responseObject?.object(forKey: "total_data")?.intValue > 0){
                            let aa: Any? = (responseObject? as AnyObject).object(forKey: "response")

                            self.data = (aa as AnyObject).mutableCopy() 
                        }

New Error Update :

Optional chain has no effect, expression already produces 'Any?'

And

Cannot call value of non-function type 'Any?!'

It works well in previous version 7.3.1 swift 2.

This is json response :

{
 "meta":{"status":200,"msg":"OK"},
        "response":[""],
        "total_data":0
}

Upvotes: 9

Views: 29512

Answers (2)

kabiroberai
kabiroberai

Reputation: 2913

Unlike Swift 2, Swift 3 imports Objective-C's id as Any? instead of AnyObject? (see this Swift evolution proposal). To fix your error, you need to cast all of your variables to AnyObject. This may look something like the following:

jsonmanager.post("http://myapi.com", parameters: nil) { (operation: AFHTTPRequestOperation?, responseObject: Any?) in
    let response = responseObject as AnyObject?
    let meta = response?.object(forKey: "meta") as AnyObject?
    let status = meta?.object(forKey: "status") as AnyObject?
    let totalData = response?.object(forKey: "total_data") as AnyObject?
    if status?.intValue == 200 && totalData?.intValue != 0 {
        let aa = response?.object(forKey: "response") as AnyObject?
        self.data = aa?.mutableCopy() 
    }
}

Upvotes: 19

NRitH
NRitH

Reputation: 13893

Your responseObject is Optional (specifically, an Any?), so you have to unwrap it in order to call its methods or access its properties, like responseObject?.object(forKey: "meta"), etc. There are several places in the frameworks where values that used to be non-Optional are now Optional, especially where they were used in Objective-C without a specified nullability qualifier.

Upvotes: 1

Related Questions