2014-09-24 2 views
11

UIView необходимо изменить предупредительный знак в зависимости от обработчика завершения работы пользовательского элемента управления:Вложенные замыкания не нравится список аргументов

voucherInputView.completionHandler = {[weak self] (success: Bool) -> Void in 

     self?.proceedButton.enabled = success 
     self?.warningLabel.alpha = 1.0 

     if success 
     { 
      self?.warningLabel.text = "Code you entered is correct" 
      self?.warningLabel.backgroundColor = UIColor.greenColor() 
     } 
     else 
     { 
      self?.warningLabel.text = "Code you entered is incorrect" 
      self?.warningLabel.backgroundColor = UIColor.orangeColor() 
     } 


     UIView.animateWithDuration(NSTimeInterval(1.0), animations:{()-> Void in 
      self?.warningLabel.alpha = 1.0 
     }) 

Окончательный анимации блок показывает ошибку в форме.

Cannot invoke 'animateWithDuration' with an argument list of type '(NSTimeInterval), animations:()-> Void)' 

Если я называю это где-то за пределами закрытия закрывания, он работает.

ответ

39

Проблема заключается в том, что закрытие неявно возвращает результат этого выражения:

self?.warningLabel.alpha = 1.0 

но сама крышка объявлена ​​как возвращающая Void.

Добавление явный return должен решить проблему: решение

UIView.animateWithDuration(NSTimeInterval(1.0), animations: {()-> Void in 
    self?.warningLabel.alpha = 1.0 
    return 
}) 
+0

спасибо большое =) !! –

+5

Это исправило это для меня, но кто-то подумает, чтобы объяснить * почему * это поведение настолько странно и неожиданно для многих людей? BTW, в вашем примере вы можете заменить '() -> Void' на '_' и добавить return using'; return' в ту же строку. ТАКЖЕ, вы можете написать ';() 'вместо однострочного' return'. :) – BastiBen

+0

Это правильный ответ !!! –

0

Антонио также применяется с вложенными замыканиями, как делать запрос AFNetworking внутри обработчика UITableViewRowAction.

override func tableView(tableView: UITableView, editActionsForRowAtIndexPath indexPath: NSIndexPath) -> [AnyObject]? { 

    let cleanRowAction = UITableViewRowAction(style: UITableViewRowActionStyle.Default, title: "Do Stuff", handler: {[weak self](action: UITableViewRowAction!, indexPath: NSIndexPath!) in 

     AFHTTPSessionManager(baseURL: NSURL(string: "http://baseurl")).PUT("/api/", parameters: nil, success: { (task: NSURLSessionDataTask!, response: AnyObject!) -> Void in 

       // Handle success 

       self?.endEditing() 
       return 
      }, failure: { (task: NSURLSessionDataTask!, error: NSError!) -> Void in 

       // Handle error 

       self?.endEditing() 
       return 
     }) 
     return 

    }) 

    cleanRowAction.backgroundColor = UIColor.greenColor() 
    return [cleanRowAction] 
}