ile çalışacak şekilde atama yapamadım Bir tamamlama işleyici ile mevcut işlevime bir throws
eklemeye çalışıyorum ama no calls throwing functions occur within try expression
diyerek bir uyarı almaya devam ediyorum. Ben hataları atmak bölümde,Tamamlama işleyicisi
invalid conversion from throwing function of type '() throwing -> Void' to non-throwing function type.
enum LoginError: ErrorType {
case Invalid_Credentials
case Unable_To_Access_Login
case User_Not_Found
}
@IBAction func loginPressed(sender: AnyObject) {
do{
try self.login3(dict, completion: { (result) -> Void in
if (result == true)
{
self.performSegueWithIdentifier("loginSegue", sender: nil)
}
})
}
catch LoginError.User_Not_Found
{
//deal with it
}
catch LoginError.Unable_To_Access_Login
{
//deal with it
}
catch LoginError.Invalid_Credentials
{
//deal with it
}
catch
{
print("i dunno")
}
}
func login3(params:[String: String], completion: (result:Bool) throws -> Void)
{
//Request set up
let task = session.dataTaskWithRequest(request, completionHandler: {data, response, error -> Void in
do {
let json = try NSJSONSerialization.JSONObjectWithData(data, options: .MutableLeaves) as? NSDictionary
if let parseJSON = json
{
let userID = parseJSON["user_id"] as? Int
let loginError = parseJSON["user_not_found"] as? String
let validationError = parseJSON["invalid_credentials"] as? String
let exception = parseJSON["unable_to_access_login"] as? String
var responseArray = [(parseJSON["user_id"] as? Int)]
if userID != nil
{
dispatch_async(dispatch_get_main_queue()) {
completion(result:true)
}
}
else if loginError != ""
{
dispatch_async(dispatch_get_main_queue()){
completion(result: false)
self.loginErrorLabel.text = loginError
throw LoginError.User_Not_Found
}
}
else if validationError != ""
{
dispatch_async(dispatch_get_main_queue()){
completion(result:false)
self.validationErrorLabel.text = validationError
throw LoginError.Invalid_Credentials
}
}
else if exception != nil
{
dispatch_async(dispatch_get_main_queue()){
completion(result:false)
self.exceptionErrorLabel.text = "Unable to login"
throw LoginError.Unable_To_Access_Login
}
}
}
else
{
}
}
catch let parseError {
// Log the error thrown by `JSONObjectWithData`
})
task.resume()
}
Bu bir eşzamansızlık işlevi. Geri dönüşünüzde, atmadığınız bir hatayı geri göndermeniz gerekir, programınızı attığınız anda bu fonksiyondan geri döndüğünüzde, o zaman işe yaramaz. – sbarow
Biraz kafam karışık. Geri aramanın geri çağırma atmasını içeren işlevini atmasını mı yoksa atmamasını mı istiyorum? Ne tür bir hatanın atılacağını belirlemek için sunucudan gelen yanıtı bekliyorum, bu da geri çağrının atması gerektiğini düşünmemi sağlıyor. – Brosef
@Victor Sigler cevabı sizin aradığınız şeydir. – sbarow