Если компилятор может определить тип вашего закрытия, вы можете использовать неявное возвращение и сокращенные имена аргументов, тем самым объявив о закрытии, как:
let sorted = [ 4, 3, 1, 40, 19 ].sort { $0 > $1 }
Однако, если компилятор не может определить его, вы необходимо объявить параметры, чтобы они могли быть уверены.
Возьмите этот пример, со своим собственным кодом:
class Bar {
func foo() {
}
func foo(s: String) {
}
func sample() {
// this works
let a = UIAlertAction(title: "a", style: .Default, handler: { self.foo($0.title) })
// this doesn't work
let a = UIAlertAction(title: "a", style: .Default, handler: { self.foo() })
}
}
Замыкание обработчик имеет определение ((UIAlertAction) -> (Пустота)!) !, так что ожидает закрытия с одним аргументом (предполагаемый тип UIAlertAction) и ничего не возвращает.
Первый пример работает, потому что, используя $ 0, вы говорите компилятору, что у закрытия есть фактически один аргумент, а поскольку последний вызов - это функция foo, которая ничего не возвращает, ваше закрытие имеет аргумент и ничего не возвращает, поэтому компилятор может использовать его таким образом.
Однако второй не работает, потому что даже если foo ничего не возвращает, вы не используете никаких параметров, и, таким образом, компилятор не может сказать, что у вашего закрытия есть аргумент. Для компилятора ваше закрытие: (Void) -> (Void), которое не является правильным типом.
Ответ ABakerSmith, вероятно, что вам нужно в этом случае, если ваша функция foo или определение закрытия не позволит определить тип замыкания компилятором. Вы все еще должны объявить параметры, но игнорировать их будет лучший курс действий:
let a = UIAlertAction(title: "a", style: .Default, handler: { _ in self.foo() })
Я считаю, что путаница вызвана тем, что имя «действие» в обработчике не обозначает «UIAlertAction», который вы определяете, это означает аргумент, который обработчик будет передан при его вызове. В C++ вы должны написать '[] (автоматическое действие) {this-> foo(); } ' – molbdnilo