Ambiguous reference to member Swift 3

35,817

Solution 1

I think the problem is caused by some shortcomings of Swift's type inference in combination with closures. You could try one of the following:

Either don't use trailing closures, e.g.

oauthswift.authorize(withCallbackURL: URL(string: info.callBackUrl)!, scope: info.scope, state: info.state, success: { (credential, response, parameters) in

         successHandler(credential, response, parameters)
}, failure: { (error) in

    failure(error: error)
    print(error.localizedDescription)
})

or provide an explicit type for error, e.g.

 oauthswift.authorize(withCallbackURL: URL(string: info.callBackUrl)!, scope: info.scope, state: info.state, success: { (credential, response, parameters) in

         successHandler(credential, response, parameters)
 }) { (error: Error) in

     failure(error: error)
     print(error.localizedDescription)
 }

Solution 2

For reference: This kind of error appears when there's more than one variable/method with the same name, does your oauthswift has more than one "thing" called "authorize"? like another method? My error was that i declared:

let fileManager = FileManager()

and in

let _ = try localFileManager.createDirectory(...) 

I got the same error, changing the variable name in localFileManager fixed it.

Solution 3

I got the same error Ambiguous reference to member with the same method on converting it from Swift 4 to Swift 5. Looks like the completion handler has been changed to support the new Result type. Changing the completing handler to below fixed the issue for me,

        oauthVarSwift.authorize( withCallbackURL: URL(string: "")!,
                             scope: "", state:"", completionHandler: {  result in
                                switch result {
                                case .success(let credential, let response,  let parameters):
                                    print(credential.oauthToken)

                                case .failure(let error):
                                 print(error)
                                }

          })
Share:
35,817
Umair Afzal
Author by

Umair Afzal

Happy Coding :-)

Updated on September 04, 2020

Comments

  • Umair Afzal
    Umair Afzal over 3 years

    I am migrating my project from Swift 2.3 to Swift 3. And having difficulty as expected.

    Here is a function which is being used for OAuth, using OAuthSwift. I have tried to convert

    class func OAuthSwiftAuthorization(inViewController viewController: UIViewController, withOAuthInfo info:FitnessTracker, successHandler:@escaping MyOAuthNewSuccessHandler, failure: @escaping ((_ error: NSError) -> Void)) {
    
        let oauthswift = OAuth2Swift(
            consumerKey:    info.consumerKey,
            consumerSecret: info.consumerSecret,
            authorizeUrl:   info.authorizeUrl,
            accessTokenUrl: info.accessTokenUrl,
            responseType:   info.responseType
        )
    
        oauthswift.authorizeURLHandler = SafariURLHandler(viewController: viewController, oauthSwift: oauthswift)
        oauthswift.accessTokenBasicAuthentification = true
        oauthswift.allowMissingStateCheck = true
    
        oauthswift.authorize(withCallbackURL: URL(string: info.callBackUrl)!, scope: info.scope, state: info.state, success: { (credential, response, parameters) in
    
                 successHandler(credential, response, parameters)
        }) { (error) in
    
            failure(error: error)
            print(error.localizedDescription)
        }
    }
    

    But I am getting an error at

    oauthswift.authorize(withCallbackURL: URL(string: info.callBackUrl)!, scope: info.scope, state: info.state, success: { (credential, response, parameters) in
    

    Error states

    Ambiguous reference to member 'authorize(withCallbackURL:scope:state:parameters:headers:success:failure:)'

    Here is the working code from Swift 2.

        oauthswift.authorizeWithCallbackURL(
            URL(string: info.callBackUrl)!,
            scope: info.scope, state:info.state,
            success: { credential, response, parameters in
    
                successHandler(credientials: credential, response: response, params: parameters)
            },
            failure: { error in
    
                failure(error: error)
                print(error.localizedDescription)
            }
        )
    

    UPDATE:

    Error does not appear unitil I type success and faliure handelrs. This complies fine:

            oauthswift.authorize(withCallbackURL: URL(string: info.callBackUrl)!, scope: info.scope, state: info.state, success: { (credential, response, parameters) in
            // successHandler(credential, response, parameters)
        }) { (erorr) in
            // failure(error: error
        }
    

    So Please guide me Thanks.

  • Umair Afzal
    Umair Afzal over 7 years
    Not using a trailing closure did the trick. But I do not understand why !!
  • Andreas Oetjen
    Andreas Oetjen over 7 years