2015-01-04 17 views
7

Ich habe ein Obj-c-Projekt, dem ich erfolgreich eine neue Swift-Klasse hinzugefügt A, die von einigen vorhandenen Obj-C-Klasse B verwendet wird - die Verwendung der automatisch generierten "MyProject-Swift.h" Header funktionierte wie erwartet.Swift-Klasse mit Objective-C-Klasse mit Swift-Klasse

Ich habe auch erfolgreich eine neue Swift-Klasse C hinzugefügt, die einige vorhandene Obj-C-Klasse D verwendet - die Verwendung der Bridging-Header funktionierte auch wie erwartet.

Angenommen, ich möchte von meiner Swift-Klasse C auf die vorhandene obj-c-Klasse B verweisen (die sich wiederum auf die neue Swift-Klasse A bezieht). Dazu muss ich "B.h" in den Bridging-Header importieren. Wenn ich dies tue, erhalte ich jedoch einen Fehler in der Klasse B: "'MyProject-Swift.h' Datei nicht gefunden" (d. H. Die Datei wird nicht mehr generiert).

Mache ich etwas falsch oder ist das eine Art Interaktion zwischen Swift und Objective-C, die nicht erlaubt ist? Es sieht so aus, als gäbe es eine Art Zirkelverweis, den der Compiler nicht lösen kann.

--- EDIT ---

Ich werde versuchen, die Frage klarer zu machen, indem Sie einige Code hinzufügen.

- PREAMBLE -

habe ich eine neue Swift-Klasse zu einem obj-c Projekt:

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

Der Code kompiliert korrekt und wird in obj-c Stummel in den automatisch generierten "übersetzt MyProject-Swift.h“Header wie folgt:

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

, nun ein obj-c-Klasse verwendet SwiftClassA:

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

Dies funktioniert auch nahtlos.

- DIE FRAGE -

Kann ich erstellen jetzt eine neue Swift-Klasse, mit der obj-c-Klasse bezeichnet (ObjCClass), der die Swift-Klasse SwiftClassA verwendet?

Das kann ich nicht tun.

Wenn ich die neue Swift-Klasse hinzufügen:

// 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)") 
    } 
} 

dies natürlich nicht wegen „Verwendung von ungelöster Kennung‚ObjCClass‘“ kompiliert. Also muss ich das auf die Überbrückung Header-Datei hinzuzufügen:

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

Allerdings, wenn ich das tue, die ObjCClass.h Datei wird nicht ein „‚MyProject-Swift.h‘Datei nicht gefunden“ Übersetzen geben.

Ich habe an mehreren Stellen (ohne Beispiel) gelesen, dass dies bedeuten kann, dass es einen Zirkelverweis gibt und dass ein Vorwärtsverweis mit @class das Problem lösen könnte. Ich bin mir jedoch nicht sicher, auf was verwiesen werden muss und wo und alle meine Versuche fehlgeschlagen sind.

Ich hoffe, die Frage ist jetzt nicht mehr verwirrend!

+2

Ich glaube nicht, diese Frage ist schlecht gestellt oder unklar, und die Das Problem ist real und von echtem Interesse (zumindest für mich). Ich bin nicht gegen die Ablehnung, aber könnten Sie mir bitte wenigstens sagen, was mit dieser Frage nicht stimmt? Wenn es ein Duplikat ist, wo ist das Duplikat? Wenn es zu offensichtlich ist, wie lautet die Antwort? Danke – Maiaux

+0

In seiner aktuellen Form ist die Frage sehr verwirrend. –

+0

Diese Frage scheint mir vernünftig. –

Antwort

11

Dies ist ein typisches zyklisches Referenzierungsproblem.

Vorsicht the docs zu lesen:

Zur Vermeidung von zyklischen Referenzen, Swift importiert nicht in eine Objective-C-Header-Datei. Stattdessen können Sie eine Swift-Klasse deklarieren, um sie in einem Objective-C-Header zu verwenden. Beachten Sie, dass Sie in Objective-C keine Swift-Klasse ableiten können.

Also, sollten Sie "vorwärts erklären" in .h und #import in .m verwenden:

// 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