2015-01-04 24 views
7

私は、既存のobj-cクラスBで使用されている新しいSwiftクラスAを正常に追加したobj-cプロジェクトを持っています。 "MyProject-Swift.h"ヘッダーが期待どおりに機能しました。Swiftクラスを使用したObjective-Cクラスを使用したSwiftクラス

既存のobj-cクラスDを使用する新しいSwiftクラスCを正常に追加しました。ブリッジヘッダーの使用も期待どおりに機能しました。

しかし、SwiftクラスCから既存のobj-cクラスB(新しいSwiftクラスAを参照してください)を参照したいとします。それを行うために、私はブリッジヘッダーに "B.h"をインポートする必要があります。しかし、私がそれを行うと、クラスBでエラーが発生します: "'MyProject-Swift.h'ファイルが見つかりません"(つまり、ファイルは生成されません)。

私は何か間違っているのですか、これはSwiftとObjective-Cの間の相互作用の一種ですか?許可されていませんか?コンパイラが解くことができない種類の循環参照があるようです。

--- EDIT ---

私はいくつかのコードを追加して、質問を明確にしようとするでしょう。

- 序文 -

Iがobj-Cのプロジェクトに新しいスウィフトクラスを追加しました:

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

コードが「正しくコンパイルし、自動的に生成された中でOBJ-Cスタブに変換されますMyProjectと-Swift.h」は、そうのようなヘッダ:

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

今一OBJ-CクラスはSwiftClassAを使用する:

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

これもシームレスに機能します。

- QUESTION -

が、私は今、OBJ-Cクラス(ObjCClass)スウィフトクラスSwiftClassAを使用しているを参照する新しいスウィフトクラスを作成することはできますか?

これは私ができないことです。

私は新しいスウィフトクラスを追加する場合:

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

これは、もちろん理由でコンパイルされません「未解決識別子の使用 『ObjCClass』」。私はそれを行う場合は、ObjCClass.hファイルが見つかりません「『MyProjectと-Swift.h』ファイル」を与えるコンパイルされません

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

:だから私は、ブリッジングヘッダファイルにそれを追加する必要があります。

これは、循環参照があり、@classを使った前方参照が問題を解決できることを意味するかもしれないということをいくつかの場所で(例はありませんが)読みました。しかし、私は前方参照される必要があるもの、どこで、そしてすべての私の試みが失敗したか分からない。

私は今質問がもう混乱しないことを願っています!

+2

私はこの質問は不良設定か不明であると思うし、しません。問題は本当であり、本当に興味があります(私にとっては、少なくとも)。私はdownvotingに反対していないが、少なくともこの質問に間違っていることを教えてくださいできますか?それが複写であれば、複写はどこですか?それがあまりにも明白な場合、答えは何ですか?ありがとう – Maiaux

+0

現在の形式では、質問は非常に混乱しています。 –

+0

この質問は私には妥当と思われます。 –

答えて

11

これは、典型的な周期的な参照問題です。

the docsを読むように注意してください:

循環参照を避けるために、はObjective-Cのヘッダファイルにスウィフトをインポートしないでください。代わりに、Swiftクラスを宣言してObjective-Cヘッダーで使用することができます。 Objective-CではSwiftクラスをサブクラス化できないことに注意してください。

だから、あなたは.hに「前方宣言」、および#import.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 
関連する問題