2014-06-07 17 views
17

Sto integrando il codice Swift in un grande progetto Objective-C, ma sto incontrando problemi quando il mio codice Swift fa riferimento alle classi Objective-C. Ad esempio, supponiamo di avere:Come posso aggiungere i riferimenti alle classi utilizzati nell'intestazione -Swift.h?

  1. Una classe Objective-C chiamato MyTableViewController
  2. Una classe Objective-C chiamato DeletionWorkflow

ho dichiarato una classe Swift come segue:

class DeletionVC: MyTableViewController { 
    let deleteWorkflow: DeletionWorkflow 

    ... 
} 

Se ora provo a utilizzare questa classe importando ProjectName-Swift.h nel codice Objective-C, ottengo errori di simboli non definiti per entrambi MyTableViewController e DeletionWorkflow.

posso risolvere il problema in quel file sorgente individuale mediante l'importazione DeletionWorkflow.h e MyTableViewController.h prima di importare ProjectName-Swift.h ma ciò non scalare fino a un grande progetto in cui voglio che il mio Swift e Objective-C per interagire spesso.

C'è un modo per aggiungere i riferimenti di classe a ProjectName-Swift.h in modo che questi errori non si verifichino quando provo a utilizzare le classi Swift dal codice Objective-C nella mia app?

risposta

15

Questo è un po 'sciocco, ma sembra che la tua "soluzione" sia ciò che Apple intendeva, almeno per ora. Da the interoperability guide:

Se si utilizzano i propri tipi Objective-C nel codice Swift, assicurarsi di importare le intestazioni Objective-C per quei tipi prima di importare la Swift generato intestazione nel file Objective-C .m voi vuoi accedere al codice Swift da.

In this devforums thread, qualcuno ha menzionato che hanno già registrato un errore in Radar. You probably should too.

+0

Non sarei sorpreso se non risolvessero mai questo. Sembra un problema difficile, non facilmente risolvibile usando tecniche statiche come le intestazioni di bridging. Penso che l'unico modo sarebbe di eliminare completamente il meccanismo di intestazione del bridging e sposare i compilatori Swift e Objective-C più strettamente insieme. – Echelon

16

È possibile creare un altro file di intestazione che inoltra dichiara o importa le classi necessarie e quindi importa ProjectName-Swift.h. Ad esempio, creare un file chiamato ProjectName-Swift-Fixed.h con il contenuto:

// ProjectName-Swift-Fixed.h 

// Forward declarations for property classes 
@class DeletionWorkflow; 

// Imports for superclasses 
#import "MyTableViewController.h"; 

#import "ProjectName-Swift.h" 

Poi, invece di #import "ProjectName-Swift.h" nella vostra base di codice, utilizzare #import "ProjectName-Swift-Fixed.h.

+0

Sicuramente d'accordo che questo è un bug. Speriamo che Apple lo renda più facile presto! – johnboiles

+0

Questa è sicuramente la soluzione più ovvia: è sufficiente creare un'intestazione a doppio ombrello, come per un framework. Sì, potevano/avrebbero dovuto farlo, ma è abbastanza facile da aggirare dato tutti gli altri bug che dovrebbero risolvere prima. –

+0

ha avuto più fortuna con la codifica #import $ (SWIFT_MODULE_NAME) -Swift.h – johndpope

Problemi correlati