#ios #swift
Вопрос:
alert.addAction(UIAlertAction(title: "Cancel", style: UIAlertActionStyle.default, handler: { _ in
//Cancel Action
}))
alert.addAction(UIAlertAction(title: "Sign out",
style: UIAlertActionStyle.default,
handler: {(_: UIAlertAction!) in
//Sign out action
}))
Во второй декларации есть эта handler: {(_: UIAlertAction!)
дополнительная часть, поэтому мне было интересно, необходимо ли это и что она делает?
Источник: https://medium.com/swift-india/uialertcontroller-in-swift-22f3c5b1dd68
Комментарии:
1. Аннотация типа-это просто синтаксический сахар, и она не нужна. И последний восклицательный знак в любом случае неверен.
Ответ №1:
С точки зрения составления этого
handler: {(_: UIAlertAction!) in
это то же самое, что
handler: { _ in
Но если вы не используете переменную действия предупреждения внутри обратного вызова по какой-либо причине, подобной этой
handler: { alertAction in
print(alertAction.title) // e.x
}).
Тогда делать handler: { _ in
лучше, чем делать handler: {(_: UIAlertAction!) in
TLDR
- Как правило, обратный вызов предоставляется в случае, если разработчику необходимо выполнить какое-либо дело при нажатии на действие предупреждения, если этому бизнесу что-либо нужно от действия предупреждения, то ниже 2 варианта, которые можно записать
1- handler: { alertAction in // recommended 2- handler: { (alertAction:UIAlertAction) in // too long
- Если есть бизнес-часть из действия предупреждения, то ниже приведены 2 варианта, которые можно записать
1- handler: { _ in // short and better 2- handler: { (_:UIAlertAction) in // worst ever
- Также, если вы ничего не делаете при нажатии на действие предупреждения, укажите ноль
alert.addAction(UIAlertAction(title: "Sign out", style: UIAlertActionStyle.default, handler:nil)
Комментарии:
1. примечание — большинство людей будут использовать трейлинг-закрытие:
alert.addAction(UIAlertAction(title: "Sign Out", style: .default) { _ in ... })
2. @Sulthan, конечно, это самый короткий способ избавиться от имени параметра обратного вызова
Ответ №2:
Не должно быть разницы между:
block: { parameter in ... }
block: { (parameter) in ... }
block: { (parameter: TypeOfTheParameter) in ... }
Если вы не используете var, вы можете заменить его на «_», поэтому у вас есть;
block: { _ in ... }
block: { (_) in ... }
block: { (_: TypeOfTheParameter) in ... }
Обычно нет необходимости явно указывать класс параметра.
Однако некоторые общие методы могут быть предпочтительнее.
Приложенный к вашему образцу:
block: handler
parameter: _
TypeOfTheParameter: UIAlertAction
Это !
не должно быть полезно в современном Swift (и может даже вызвать предупреждение или ошибку компилятора). Ваш учебник датирован 2018 годом, с тех пор Swift изменился.