ios - swift uitextfield change event
error del controlador de finalizaciĆ³n en swift 3 y Xcode 8 (2)
Aunque no sabía el error antes de eso, Xcode quiere informarme sobre el error, pero eliminé la especificación de tipo con el objeto 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 a la pregunta, el error se da en dataTask
y responseObj
que están con el tipo especificado. Después de quitar el tipo funcionó bien.
Igual que con el inicio de sesión de facebook
@IBAction func fbLoginClicked(_ sender: AnyObject) {
let app = UIApplication.shared.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 problema resuelto. Y siguió esto en toda la aplicación y funcionó. Puedo ejecutar el proyecto sin error y también está funcionando. Gracias.
Tengo proyecto de trabajo en Xcode 7.3 con la versión swift 2.2. Ahora he actualizado Xcode 8 y he migrado a Swift 3. Ahora mi proyecto contiene errores especialmente para bloques como el bloque exitoso de redes.
Lo 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 según swift 3.
Y también hay un error similar en el inicio de sesión de Facebook.
Lo 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 estos errores están relacionados con los bloques de manejador 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 la conversión de los parámetros de la función object-c en Swift.
Anteriormente, si los parámetros en el código objetivo-c no tenían atributos de nulabilidad (como no nonnull
o nonnull
), Swift lo convierte con !
Haciéndolos no opcionales (desenvolvimiento forzado). Ahora lo conviertes con ?
haciéndolos opcionales. Es por eso que está recibiendo un error. Antes de poner como devolución de llamada para iniciar sesión:
(FBSDKLoginManagerLoginResult!, NSError!) -> Void
Ahora tienes que poner:
(FBSDKLoginManagerLoginResult?, Error?) -> Void
Además, como puede ver, ahora no verá la clase NSError
. En lugar de eso, Swift pondrá Error
. Esta también es una regla nueva. Ahora todos los prefijos "NS" en los nombres de clase se eliminan en Swift ( NSObject
-> Object
; NSError
-> Error
).
Ejemplo de código de trabajo para el inicio de sesión de 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 solicitud de facebook en Swift 3.0:
let request = FBSDKGraphRequest()
request.start {
(connection: FBSDKGraphRequestConnection?, result: Any?, error: Error?) in
}
Como puedes ver, ahora está usando Any
tipo en lugar de id
-objetivo-c. En Swift 2.2 estaba utilizando AnyObject
. También es la nueva regla de conversión Swift.
No es necesario especificar el tipo de parámetros de devolución de llamada. Lo hice en código para resaltar sus tipos reales. Así que 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 hay que recordar que son opcionales ahora.
En conclusión, algunas reglas de conversión que pueden afectar su código de devolución de llamada:
- Los parámetros de cierre son opcionales si en object-c no se especifican atributos de nulabilidad.
- Todos los prefijos "NS" se eliminan para las clases de object-c en Swift
- Si la función
AnyObject
-c tenía un parámetroid
, en Swift 3.0 tendrá el tipoAny
lugar deAnyObject