2016-05-09 22 views
5

Sto provando a migrare lentamente da Obj-C a Swift. Il mio primo passo è quello di migrare piccoli e semplici metodi alle estensioni di Swift, così ho deciso di provare a migrare didRegisterForRemoteNotifications ma questo non ha funzionato perché pensa che il metodo sia implementato da qualche altra parte nel mio codice Objective-C. Non è.L'implementazione didRegisterForRemoteNotificationsWithDeviceToken in un'estensione Swift non funziona

sto usando Xcode 7.3 (7D175)

Ecco alcuni passaggi di riproduzione:

  • Creare un nuovo progetto Obj-C.
  • Creare un nuovo file Swift vuoto denominato AppDelegate-Extension.swift. Questo crea anche un file di intestazione Bridging.
  • Aggiungi #import AppDelegate.h al file di intestazione Briding.
  • Vai alla scheda Swift vuoto e digitare:

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

Questo fa sì che a compilatore a lamentarsi:

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)

Che cosa sto facendo di sbagliato?

EDIT: Alcuni suggerimenti che ho provato:

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

Ciò restituisce il seguente errore (in aggiunta a l'errore originale)

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

+0

cosa intendi con file di intestazione rapido? Dovresti creare una classe Bridge e importare il tuo 'AppDelegate.h' lì –

+0

Scusa, questo è esattamente quello che intendevo. Ho modificato la domanda per riflettere questo. – OlivaresF

+0

prova 'applicazione di override func (applicazione: UIApplication, didRegisterForRemoteNotificationsWithDeviceToken deviceToken: NSData) {' –

risposta

2

Il tuo problema è che si può utilizzare un'estensione in questo modo in un ambiente misto Objective-C Swift &.

In Swift, è possibile utilizzare un'estensione per fornire implementazioni per funzioni dichiarate in un protocollo adottato da una classe. Questo è il nucleo di "programmazione orientata al protocollo"

In Objective-C, una categoria viene utilizzata per aggiungere funzioni aggiuntive a una classe esistente. Quando crei l'estensione Swift, Xcode crea un nome di destinazione -Swift.h nella cartella dei dati derivati. Ora, non si può vedere questo file perché la vostra compilazione è mancanza, ma se si cambia un po 'l'interno in modo che la compilazione funziona

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

e poi si guarda a questo file può trovare qualcosa di simile:

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

Nota come il tuo metodo di estensione è stato aggiunto come categoria su AppDelegate. Ora, immaginate che cosa questo file potrebbe apparire come se tu avessi la forma corretta della funzione (senza app nella firma)

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

Si tratta di una ri-dichiarazione di un metodo che è già dichiarato nel protocollo UIApplicationDelegate.

Il risultato di tutto questo è che vi sia bisogno di adottare Swift su una base di classe-by-classe o è necessario utilizzare sottoclassi, se si desidera utilizzare una base function-by-function poiché non v'è una differenza tra un Categoria Objective-C e estensione Swift.

+0

Sì My Test-Swift.h file autogenerato sembra molto simile a quello che hai menzionato ... Grazie! – OlivaresF

Problemi correlati