I created a promise which gets some data from API and returns it. Now what i am stuck is after getting the json data i need to store them on device storage (realm). After calling the promise when i try with then i get some error stating Cannot convert value of type '(Any) -> Void' to expected argument type '(_) -> _' . But when i try with done it works perfectly. But i need to use then to save the data on realm.
Following approch works fine
Translator().translators().done { data -> Void in
print(data[0].name)
}.catch { error in
print(error)
}
But following two approach fails
Translator().translators().then() { data -> Void in
print(data)
}.catch() {
(e: Error) in
print(e)
}
Above gives an error that says
Cannot convert value of type '(Any) -> Void' to expected argument type '(_) -> _'
and following approach gives another similar error
Translator().translators().then() {
(data: [Translator]) -> Void in
print(data[0].name)
}.catch() {
(e: Error) in
print(e)
}
error message:
Cannot convert value of type '([Translator]) -> Void' to expected argument type '([Translator]) -> _'
Promise i created:
func translators() -> Promise<[Translator]> {
return firstly {
Alamofire.request("http://192.168.0.107:3000/translatdors", method: .get).responseData()
}.map {
try JSONDecoder().decode([Translator].self, from: $0.data)
}
}
Image of my code and error
You have to return a promise when you do .then because until .done you are not finished. I don't see any issue in saving realm data in .done as your method has no return type.
Incase you still want to use .then, it can be done this way.
Translator().translators().then({ data -> Promise<[Translator]> in
return Promise.value(data)
}).done({ data in
// Save to realm
}).catch({ error in
print(error.localizedDescription)
})
Related
I have a function where I try to get a users current address through their lat/long. But I am getting an error saying Cannot convert value of type '(GMSReverseGeocodeResponse, _) -> Void' to expected argument type 'GMSReverseGeocodeCallback' (aka '(Optional<GMSReverseGeocodeResponse>, Optional<Error>) -> ()')
func googleMapsReverseGeocoding(){
let gmsGeocoder = GMSGeocoder()
gmsGeocoder.reverseGeocodeCoordinate((CLLocationCoordinate2DMake(currentLocation.coordinate.latitude, currentLocation.coordinate.longitude))) { //This is where I get the error.
(gmsReverseGeocodeResponse: GMSReverseGeocodeResponse!, error: NSError!) -> Void in
let gmsAddress: GMSAddress = gmsReverseGeocodeResponse.firstResult()
print("\ncoordinate.latitude=\(gmsAddress.coordinate.latitude)")
print("coordinate.longitude=\(gmsAddress.coordinate.longitude)")
print("thoroughfare=\(gmsAddress.thoroughfare)")
print("locality=\(gmsAddress.locality)")
print("subLocality=\(gmsAddress.subLocality)")
print("administrativeArea=\(gmsAddress.administrativeArea)")
print("postalCode=\(gmsAddress.postalCode)")
print("country=\(gmsAddress.country)")
print("lines=\(gmsAddress.lines)")
}
}
Can someone let me know what I am doing wrong?
You need
gmsGeocoder.reverseGeocodeCoordinate((CLLocationCoordinate2DMake(currentLocation.coordinate.latitude, currentLocation.coordinate.longitude))) {
(response, error) in
}
i have a generic function for json parsing
static func parseServerResponse<T>(_ type: T.Type, from data: Data)-> T? where T : Decodable{
do {
return try JSONDecoder().decode(type, from: data)
} catch(let error) {
print(error.localizedDescription)
return nil
}
}
And it is returning me "Cannot convert value of type 'Data' to expected type 'Data" and on other places where i am using data to return or doing anything with data. why's that so. i have no idea why would it throw a stupid error like that. i have cleaned my project several times, quit xcode and restarted it, updated my pods to no avail. here's a screenshot
I have the following code snippet.
camera.onDeviceChange = { [weak self] (camera: LLSimpleCamera!, device: AVCaptureDevice!) -> Void in
print("Device changed.")
}
This used to work fine in Swift 2, but now I am getting the following error message:
Cannot assign value of type '(LLSimpleCamera!, AVCaptureDevice!) -> Void' to type '((LLSimpleCamera?, AVCaptureDevice?) -> Void)!'
Not really sure how to change this, I tried matching the type by changing the ! to optionals and then adding ! after the void, however this didn't work.
Your error suggest type mismatch that means LLSimpleCamera! != LLSimpleCamera? .. there is no need to define type. .. you can use it something like
camera.onDeviceChange = { [weak self] (camera, device) -> Void in
print("Device changed.")
}
I have working project in Xcode 7.3 with swift 2.2 version. Now I have updated Xcode 8 and migrated to swift 3. Now my project contains errors specially for blocks like success block of afnetworking.
Which gives error as
Cannot convert value of type '() -> ()' to expected argument type '((URLSessionDataTask, Any?) -> Void)?'
I don't understand how to solve this to work as per swift 3.
And there is also same like error in Facebook login.
Which gives error as
Cannot convert value of type '(FBSDKLoginManagerLoginResult!, NSError!) -> Void' to expected argument type 'FBSDKLoginManagerRequestTokenHandler!'
and
Cannot convert value of type '(_, _, NSError!) -> Void' to expected argument type 'FBSDKGraphRequestHandler!'
This all errors are related to handler blocks in swift 3. I don't understand the errors and so that can't able to solve. Any help will be appreciated. Thanks in advance.
For facebook - the problem is in new Swift rules about converting objective-c function parameters into Swift.
Previously, if parameters in objective-c code did not have nullability attributes(like nonnull or nullable), Swift converts it with ! making them non optional(forced unwrapping). Now it convert it with ? making them optional. That why you are getting an error. Before you were putting as a callback for login:
(FBSDKLoginManagerLoginResult!, NSError!) -> Void
Now you need to put:
(FBSDKLoginManagerLoginResult?, Error?) -> Void
Also, as you see, now you will not see NSError class. Instead of that Swift will put Error.This is also new rule. Now all "NS" prefixed in class names is removed in Swift(NSObject -> Object; NSError -> Error).
Example of working code for facebook login in Swift 3.0:
let manager = FBSDKLoginManager()
manager.logIn(withReadPermissions: ["public_profile"], from: self.controller) {
(loginResult: FBSDKLoginManagerLoginResult?, error: Error?) in
}
Example of working code for facebook request in Swift 3.0:
let request = FBSDKGraphRequest()
request.start {
(connection: FBSDKGraphRequestConnection?, result: Any?, error: Error?) in
}
As you see, now it is using Any type instead of objective-c id. In Swift 2.2 it was using AnyObject. It is also new Swift converting rule.
You do not need to specify callback parameters type. I did that in code for highlighting their real types. So you can just write code without them:
let manager = FBSDKLoginManager()
manager.logIn(withReadPermissions: ["public_profile"], from: self.controller) { (loginResult, error) in }
let request = FBSDKGraphRequest()
request.start { (connection, result, error) in }
But you need to remember that they are optional now.
In conclusion some converting rules that may affect you callback code:
Closure parameters are optional if in objective-c are not specified nullability attributes
All "NS" prefixes is removed for objective-c classes in Swift
If objective-c function had id parameter, in Swift 3.0 it will have type Any instead of AnyObject
Though I didn't know the error before that what Xcode want to inform me about the error, but I have removed type specification with object and it worked.
As
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)
}
}
})
Here with respect to question error is given at dataTask and responseObj which are with type specified. After removing type it worked fine.
Same as with facebook login
#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()
}
}
})
}
Here also I have removed type specification of result and error and problem solved. And followed this in whole app and it worked. I can run the project without error and also it is working. Thanks.
I get a weird error in my iOS swift app. The compiler complains at the first row of:
let task = session.dataTaskWithRequest(request) { data, response, error in
self.oauthManager.customOAuth2Manager.parseData(data, response: response, error: error, body:request, callback: { (jsonArray, error) -> Void in
})
}
The compiler error is:
Cannot invoke 'dataTaskWithRequest' with an argument list of type '(NSURLRequest, (_, _, _) -> _)'
However, it's not on that row the error seems to be located. If I remove the inner call to parseData the error does not appear.
The declaration to parseData is:
func parseData(data: NSData, response:NSURLResponse, error:NSError?, body:String?, callback:JsonRequestCallback)
where JsonRequestCallback is:
public typealias JsonRequestCallback = (jsonArray: NSArray?, error: NSError?) -> Void
Also:
let request = oauthManager.newLoginRequest(emailOrCompanyCode: emailOrCompanyCode, password: password) as NSURLRequest
let session = NSURLSession.sharedSession()
and
func newLoginRequest(var #emailOrCompanyCode: String, var password:String?) -> NSMutableURLRequest
Any ideas?
To answer my own question, Satachito was correct. Just an invalid parameter. Unfortunately the Swift compiler does not specify the exact error, not the correct line for this.
So for others having similar issues, look for misstakes in all code in any passed closures