Реализация didRegisterForRemoteNotificationsWithDeviceToken в расширении Swift не работает

Я пытаюсь медленно мигрировать из Obj-C в Swift. Мой первый шаг – перенести небольшие, простые методы в расширения Swift, поэтому я решил попробовать и didRegisterForRemoteNotifications миграцию didRegisterForRemoteNotifications но это не сработало, потому что он считает, что этот метод реализован где-то еще в моем коде Objective-C. Это не.

Я использую Xcode 7.3 (7D175)

Вот несколько этапов воспроизведения:

  • Создайте новый проект Obj-C.
  • Создайте новый пустой файл Swift под названием AppDelegate-Extension.swift . Это также создает заголовочный файл Bridging.
  • Добавьте #import AppDelegate.h в заголовочный файл #import AppDelegate.h .
  • Перейдите в пустой файл Swift и введите:

     extension AppDelegate { public func application(application: UIApplication, didRegisterForRemoteNotificationsWithDeviceToken deviceToken: NSData) { } } 

Это заставляет компилятор жаловаться:

(приложение: UIApplication, didRegisterForRemoteNotificationsWithDeviceToken deviceToken: NSData) {^ __ObjC.AppDelegate (приложение: UIApplication, didRegisterForRemoteNotificationsWithDeviceToken deviceToken: NSData) {^ __ObjC.AppDelegate (с помощью приложения Objective-C selector) : 38: 17: примечание: «приложение», ранее объявленное здесь публичным func-приложением (приложение: UIApplication, didRegisterForRemoteNotificationsWithDeviceToken deviceToken: NSData)

Что я делаю не так?

EDIT: Некоторые предложения, которые я пробовал:

Добавить override в декларацию метода, чтобы он читал override public ...

Это возвращает следующую ошибку (в дополнение к исходной ошибке)

error: метод не переопределяет какой-либо метод из своего суперкласса переопределяет общедоступное приложение func (приложение: UIApplication, didRegisterForRemoteNotificationsWithDeviceToken deviceToken: NSData)

Ваша проблема заключается в том, что вы не можете использовать расширение таким образом в смешанной среде Swift & Objective-C.

В Swift вы можете использовать расширение, чтобы обеспечить реализации для функций, которые были объявлены в протоколе, который принят классом. Это ядро ​​«протокола-ориентированного программирования»,

В Objective-C категория используется для добавления дополнительных функций в существующий класс. Когда вы создаете расширение Swift, Xcode создает файл targetname-Swift.h в папке с производными данными. Теперь вы не можете увидеть этот файл, потому что ваш компилятор терпит неудачу, но если вы слегка измените расширение, чтобы работа компиляции

 extension AppDelegate { public func application(app application: UIApplication, didRegisterForRemoteNotificationsWithDeviceToken deviceToken: NSData) { } } 

и затем вы посмотрите на этот файл, вы найдете что-то вроде:

 @interface AppDelegate (SWIFT_EXTENSION(XTNTest)) - (void)applicationWithApp:(UIApplication * _Nonnull)application didRegisterForRemoteNotificationsWithDeviceToken:(NSData * _Nonnull)deviceToken; @end 

Обратите внимание, как ваш добавочный метод был добавлен как категория в AppDelegate . Теперь представьте, как выглядел бы этот файл, если бы у вас была правильная форма вашей функции (в app нет app )

 @interface AppDelegate (SWIFT_EXTENSION(XTNTest)) - (void)application:(UIApplication * _Nonnull)application didRegisterForRemoteNotificationsWithDeviceToken:(NSData * _Nonnull)deviceToken; @end 

Это повторное объявление метода, который уже объявлен в протоколе UIApplicationDelegate .

Результатом всего этого является то, что вам нужно либо принять Swift по принципу «один за другим», либо вам нужно использовать подклассы, если вы хотите использовать функциональную функцию, поскольку существует различие между категорией Objective-C и быстрое расширение.

  • «Ошибка метода Objective-C с необязательным требованием» после обновления до XCode 6.3 (Swift 1.2)
  • Собственный сборщик iOS
  • Устраняет отклонение диспетчера viewViewControllerAnimated ()
  • Установить contentMode UIImageView
  • Шаги по созданию реляционной базы данных (sqlite) в быстрой
  • как я могу оживить UIImageView, когда пользователь перетаскивает MKMapView?
  • ios swift parse: методы с асинхронными результатами
  • Импортировать файл LocalAuthentification.framework в iOS 7.1
  • iOS9 GoogleAnalytics и NSAppTransportSecurity
  • Как получить номер телефона для созданного приложения с расширением imessage
  • Устранение проблем с сборкой Outlet
  • Interesting Posts

    UIImagepickercontroller: можно ли изменить порядок сортировки изображений в кадре камеры?

    Схема пользовательских URL-адресов iOS

    Объединение UITabBarController с UINavigationController

    Создать таблицу в PDF

    Как реализовать салфетки для выявления клеток с обеих сторон

    Загрузка изображений из фотографий в коллекцию приводит к появлению сообщения об ошибке «Соединение с активами было прервано или активы умерли»

    Аутентификация пользователя с Instagram на iOS: указание redirect_uri

    iOS requestAccessToAccountsWithType не отображает запрос на разрешение / NSAlert

    Как проверить частоту кадров моего приложения?

    Google plus API не возвращается к приложению при входе в систему

    Обновление пользовательского интерфейса с помощью «dispatch_async (dispatch_get_main_queue (), ^ {block})

    Как показать прогресс буфера на AVPlayer?

    iphone – didSelectRowAtIndexPath: только вызывается после длительного нажатия на пользовательскую ячейку

    Цель-c: Как обнаружить двойное нажатие на просмотр?

    Как перезагрузить UITableView без остановки анимации выбора ячеек

    Давайте будем гением компьютера.