Функция AppDelegate для UIApplicationShortcutItem не вызывается в Swift 3 / Xcode 8 beta 6

Конвертер Swift 3 изменил эту (отлично работающую) строку:

func application(application: UIApplication, performActionForShortcutItem shortcutItem: UIApplicationShortcutItem, completionHandler: (Bool) -> Void) {

к этому:

func application(_ application: UIApplication, performActionFor shortcutItem: UIApplicationShortcutItem, completionHandler: (Bool) -> Void) {

но оба выдают предупреждение

Метод экземпляра 'application (: handleActionWithIdentifier: for: завершение Handler:)' почти соответствует необязательному требованию 'application (: handleActionWithIdentifier: for: завершение Handler:)' протокола 'UIApplicationDelegate'

и предлагаем решение сделать функцию private или добавление @nonobjc,

Независимо от того, оставлена ​​ли функция с предупреждением, возвращена ли она к синтаксису Swift 2 или исправлена ​​любым из предложенных способов, запуск приложения с элементом ярлыка не вызывает его.

Здесь это также не упоминается как известная проблема. У кого-нибудь есть идея?

2 ответа

Решение

Подпись для этого метода теперь:

optional func application(_ application: UIApplication, 
          performActionFor shortcutItem: UIApplicationShortcutItem,
                      completionHandler: @escaping (Bool) -> Void)

Обратите внимание, что обработчик завершения сейчас @escapingв соответствии с SE-103 (по умолчанию не выходящие замыкания). Этот атрибут изменяет сигнатуру типа параметра closure, который, в свою очередь, меняет сигнатуру типа метода, аргументом которого он является, поэтому метод со старым объявлением вызываться не будет.

В общем, предупреждения / исправления компилятора не так хороши для отслеживания всех изменений сигнатур типов, особенно между бета-версиями. Лучше всего вернуться к заголовку SDK (или, скорее, к сгенерированному на нем интерфейсу Swift) или к документации на сайте Apple / в XCode для класса / протокола, определяющего метод проблемы, чтобы вы могли увидеть, каково его новое определение.

Apple представила @escaping пометка для Swift 3 Beta 6. По умолчанию все замыкания не экранируются, поэтому, если вы хотите, чтобы закрытие сбегало, вам нужно присвоить этот тег. По какой-то причине быстрый переводчик не добавил этот тег, но в соответствии с документацией по ссылке ниже, этот тег необходимо добавить до закрытия.

https://developer.apple.com/reference/uikit/uiapplicationdelegate/1622935-application

Добавление закрытия к моему коду удалило предупреждение:

func application(_ application: UIApplication, performActionFor shortcutItem: UIApplicationShortcutItem, completionHandler:@escaping (Bool) -> Void)

Я не проверял его, поэтому он мог просто удалить предупреждение по какой-то другой причине.

Другие вопросы по тегам