Функция 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)
Я не проверял его, поэтому он мог просто удалить предупреждение по какой-то другой причине.