el error del manejador de finalización en swift 3 y Xcode 8

Tengo un proyecto de trabajo en Xcode 7.3 con la versión 2.2 rápida. Ahora he actualizado Xcode 8 y he migrado a swift 3. Ahora mi proyecto contiene errores especialmente para bloques como block éxito de afnetworking.

Instantánea por error en el método de publicación de afnetworking

Que da error como

Cannot convert value of type '() -> ()' to expected argument type '((URLSessionDataTask, Any?) -> Void)?' 

No entiendo cómo resolver esto para que funcione de manera rápida 3.

Y también existe el mismo error en el inicio de session de Facebook.

Error de inicio de sesión en Facebook

Que da error como

 Cannot convert value of type '(FBSDKLoginManagerLoginResult!, NSError!) -> Void' to expected argument type 'FBSDKLoginManagerRequestTokenHandler!' 

y

 Cannot convert value of type '(_, _, NSError!) -> Void' to expected argument type 'FBSDKGraphRequestHandler!' 

Todos los errores están relacionados con los bloques de controlleres en swift 3. No entiendo los errores y, por lo tanto, no puedo resolverlos. Cualquier ayuda será apreciada. Gracias por adelantado.

Para Facebook: el problema está en las nuevas reglas de Swift sobre convertir los parameters de function objective-c en Swift.

Anteriormente, si los parameters en el código objective-c no tenían attributes de nonnull (como no nonnull o nonnull ), Swift lo convierte con ! haciéndolos no opcionales (desenvolvimiento forzado). ¿Ahora lo convierte con ? haciéndolos opcionales. Por eso estás recibiendo un error. Antes de ponerte como una callback para iniciar session:

 (FBSDKLoginManagerLoginResult!, NSError!) -> Void 

Ahora necesita poner:

 (FBSDKLoginManagerLoginResult?, Error?) -> Void 

Además, como ves, ahora no verás la class NSError . En lugar de eso Swift pondrá Error . Esta también es una nueva regla. Ahora todos los prefijos "NS" en nombres de class se eliminan en Swift ( NSObject -> Object ; NSError -> Error ).

Ejemplo de código de trabajo para iniciar session en Facebook en Swift 3.0:

 let manager = FBSDKLoginManager() manager.logIn(withReadPermissions: ["public_profile"], from: self.controller) { (loginResult: FBSDKLoginManagerLoginResult?, error: Error?) in } 

Ejemplo de código de trabajo para la request de Facebook en Swift 3.0:

 let request = FBSDKGraphRequest() request.start { (connection: FBSDKGraphRequestConnection?, result: Any?, error: Error?) in } 

Como ves, ahora está usando Any tipo en lugar de objective-c id . En Swift 2.2 estaba usando AnyObject . También es una nueva regla de conversión Swift.

No necesita especificar el tipo de parameters de callback. Lo hice en el código para resaltar sus types reales. Entonces puedes escribir código sin ellos:

 let manager = FBSDKLoginManager() manager.logIn(withReadPermissions: ["public_profile"], from: self.controller) { (loginResult, error) in } let request = FBSDKGraphRequest() request.start { (connection, result, error) in } 

Pero debes recordar que son opcionales ahora.

En conclusión, algunas reglas de conversión que pueden afectar su código de callback:

  1. Los parameters de cierre son opcionales si en objective-c no se especifican attributes de nullability
  2. Todos los prefijos "NS" se eliminan para las classs objective-c en Swift
  3. Si la function objective-c tenía el parámetro id , en Swift 3.0 tendrá el tipo Any vez de AnyObject

Aunque no sabía el error antes de que Xcode quiere informarme sobre el error, pero he eliminado la especificación de tipo con object y funcionó.

Como

 manager.post(methodname, parameters: param, progress: nil, success:{ (dataTask, responseObj) in if let dict : NSDictionary = responseObj as? NSDictionary { print("Response of \(methodname) : \(dict)") if dict.object(forKey: "response") as? String == "success" { CompletionHandler(true, dict) } else { CompletionHandler(false, dict) } } }) 

Aquí con respecto al error de pregunta se da en dataTask y responseObj que están con el tipo especificado. Después de eliminar el tipo funcionó bien.

Lo mismo que con el inicio de session de facebook

 @IBAction func fbLoginClicked(_ sender: AnyObject) { let app = UIApplication.shanetworking.delegate as! AppDelegate app.fbLoginManager = FBSDKLoginManager() app.fbLoginManager.logOut() app.fbLoginManager.loginBehavior = FBSDKLoginBehavior.native app.fbLoginManager.logIn(withReadPermissions: ["email"], from: self, handler: { (result, error) -> Void in if error != nil { print(error?.localizedDescription) } else { if (result! as FBSDKLoginManagerLoginResult).isCancelled == true { } else { self.fetchFacebookUserDetail() } } }) } 

Aquí también he eliminado la especificación de tipo de result y error y el problema resuelto. Y siguió esto en toda la aplicación y funcionó. Puedo ejecutar el proyecto sin error y también funciona. Gracias.