В чем разница между этими двумя объявлениями addAction?

#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 изменился.