2016-05-09 5 views
5

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

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

Вот некоторые шаги Размножение:

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

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

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

method 'application(_:didRegisterForRemoteNotificationsWithDeviceToken:)' with Objective-C selector 'application:didRegisterForRemoteNotificationsWithDeviceToken:' conflicts with previous declaration with the same Objective-C selector public func application(application: UIApplication, didRegisterForRemoteNotificationsWithDeviceToken deviceToken: NSData) { ^ __ObjC.AppDelegate:38:17: note: 'application' previously declared here public func application(application: UIApplication, didRegisterForRemoteNotificationsWithDeviceToken deviceToken: NSData)

Что я делаю неправильно?

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

Add override to the method declaration so it reads override public ...

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

error: method does not override any method from its superclass override public func application(application: UIApplication, didRegisterForRemoteNotificationsWithDeviceToken deviceToken: NSData)

+0

что вы имеете в виду быстрый заголовочный файл? Вы должны создать класс Bridge и импортировать 'AppDelegate.h' там –

+0

Извините, это именно то, что я имел в виду. Я отредактировал вопрос, чтобы отразить это. – OlivaresF

+0

попытка 'переопределение FUNC приложение (приложение: UIApplication, didRegisterForRemoteNotificationsWithDeviceToken deviceToken: NSData) {' –

ответ

2

Ваша проблема в том, что вы можете Не используйте расширение таким образом в среде 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 в подписи)

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

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

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

+0

Да. Мой тестовый файл Swift.h с автогенерированием выглядит очень похоже на то, о чем вы упоминали ... Спасибо! – OlivaresF

Смежные вопросы