2017-01-31 1 views
5

Я переношу свой проект с Swift 2.3 на Swift 3. И с трудом, как ожидалось.Неоднозначная ссылка на члена Swift 3

Это функция, которая используется для OAuth, используя OAuthSwift. Я попытался преобразовать

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) 
    } 
} 

Но я получаю сообщение об ошибке при

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

состояний ошибок

Неоднозначности ссылки на член «авторизовать (withCallbackURL: область применения: состояние: параметры: заголовки : success: failure :) '

Вот рабочий код от Swi фут 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:

Ошибка не появляется unitil I типа успеха и faliure handelrs. Это соответствует штрафу:

 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 
    } 

Так что, пожалуйста, помогите мне. Спасибо.

ответ

7

Я думаю, проблема связана с некоторыми недостатками вывода типа Свифта в сочетании с замыканиями. Вы можете попробовать один из следующих вариантов:

Либо не используйте задние затворы, например.

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) 
}) 

или указать явный тип ошибки, например.

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) 
} 
+0

Не использовать задние крышки сделал трюк. Но я не понимаю, почему! –

+0

Это недостаток, см. Здесь: https://lists.swift.org/pipermail/swift-dev/Week-of-Mon-20160704/002370.html –

Смежные вопросы