2015-01-04 17 views
7

Ho un progetto obj-c al quale ho aggiunto con successo una nuova classe Swift A, che viene utilizzata da qualche classe obj-c esistente B - l'uso del generato automaticamente L'intestazione "MyProject-Swift.h" ha funzionato come previsto.Classe Swift usando la classe Objective-C usando la classe Swift

Ho anche aggiunto con successo una nuova classe Swift C che utilizza qualche classe obj-c esistente D - l'uso dell'intestazione del bridging ha funzionato anche come previsto.

Tuttavia, supponiamo di voler fare riferimento alla mia classe Swift C alla classe obj-c esistente (che a sua volta si riferisce alla nuova classe Swift A). Per farlo ho bisogno di importare "B.h" nell'intestazione del bridging. Tuttavia, se lo faccio ottengo un errore in classe B: "'MyProject-Swift.h' file non trovato" (cioè, il file non viene più generato).

Sto facendo qualcosa di sbagliato o si tratta di una sorta di interazione tra Swift e Objective-C che non è consentita? Sembra che ci sia una sorta di riferimento circolare che il compilatore non è in grado di risolvere.

--- EDIT ---

Cercherò di rendere più chiara la questione con l'aggiunta di un po 'di codice.

- PREAMBOLO -

ho aggiunto una nuova classe Swift ad un progetto di obj-c:

// SwiftClassA.swift 
import Foundation 
@objc class SwiftClassA : NSObject { 
    var myProperty = 0 
} 

il codice viene compilato correttamente e si traduce in obj-c stub nella generata automaticamente " MyProject-Swift.h" header in questo modo:

// MyProject-Swift.h 
... 
SWIFT_CLASS("_TtC7MyProject11SwiftClassA") 
@interface SwiftClassA : NSObject 
@property (nonatomic) NSInteger myProperty; 
- (instancetype)init OBJC_DESIGNATED_INITIALIZER; 
@end 

Ora, una classe obj-C utilizza SwiftClassA:

// ObjCClass.h 
#import <Foundation/Foundation.h> 
#import <MyProject-Swift.h> 
@interface ObjCClass : NSObject 
@property (nonatomic, strong) SwiftClassA *aProperty; 
@property (nonatomic) int *aNumber; 
@end 

Anche questo funziona perfettamente.

- LA QUESTIONE -

Posso ora creare una nuova classe Swift che si riferisce alla classe obj-c (ObjCClass) che sta utilizzando la classe Swift SwiftClassA?

Questo è quello che non posso fare.

Se posso aggiungere la nuova classe Swift:

// SwiftClassB.swift 
import Foundation 
@objc class SwiftClassB : NSObject { 
    var aPropertyOfClassB = 1 
    func someFunc() { 
     var objCObject = ObjCClass() 
     var theProperty = objCObject.aProperty 
     print("The property is \(theProperty)") 
    } 
} 

questo, naturalmente, non verrà compilato a causa di "Uso di identificatore irrisolto 'ObjCClass'". Così ho bisogno di aggiungere che al file di intestazione colmare:

// BridgingHeader.h 
#ifndef MyProject_BridgingHeader_h 
#define MyProject_BridgingHeader_h 
... 
#import "ObjCClass.h" 
#endif 

Tuttavia, se lo faccio, il file ObjCClass.h non verrà compilato dando un " '-MyProject Swift.h' file not found".

Ho letto in diversi punti (senza alcun esempio, però) che ciò possa significare che esiste un riferimento circolare e che un riferimento in avanti che utilizza @class potrebbe risolvere il problema. Tuttavia, non sono sicuro di cosa sia necessario fare riferimento e dove e tutti i miei tentativi non sono riusciti.

Spero che ora la domanda non sia più confusa!

+2

Non credo che questa domanda è mal posto o poco chiare, e il il problema è reale e di reale interesse (almeno per me). Non sono contrario alle downvoting, ma potresti almeno dirmi cosa c'è di sbagliato in questa domanda? Se si tratta di un duplicato, dov'è il duplicato? Se è troppo evidente, qual è la risposta? Grazie – Maiaux

+0

Nella sua forma attuale, la domanda è molto confusa. –

+0

Questa domanda mi sembra ragionevole. –

risposta

11

Questo è un tipico problema di riferimento ciclico.

Fate attenzione a leggere the docs:

Per evitare riferimenti ciclici, non importare Swift in un file di intestazione Objective-C. Invece, puoi inoltrare una classe Swift per usarla in un'intestazione Objective-C. Nota che non puoi creare una sottoclasse di una classe Swift in Objective-C.

Quindi, si dovrebbe usare "avanti dichiaro" in .h, e #import in .m:

// ObjCClass.h 
#import <Foundation/Foundation.h> 

@class SwiftClassA; 

@interface ObjCClass : NSObject 
@property (nonatomic, strong) SwiftClassA *aProperty; 
@property (nonatomic) int *aNumber; 
@end 
// ObjCClass.m 
#import "ObjCClass.h" 
#import "MyProject-Swift.h" 

@implementation ObjCClass 
// your code 
@end 
Problemi correlati