Вложенные блокировки не любят список аргументов
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)'
Если я называю это где-то вне закрытия завершения, он работает.
Ответы
Ответ 1
Проблема заключается в том, что замыкание неявно возвращает результат этого выражения:
self?.warningLabel.alpha = 1.0
но сама замыкание объявляется как возвращающая Void
.
Добавление явного return
должно решить проблему:
UIView.animateWithDuration(NSTimeInterval(1.0), animations: { ()-> Void in
self?.warningLabel.alpha = 1.0
return
})
Ответ 2
Решение Antonio также применяется с вложенными замыканиями, например, с запросом 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]
}