2017-11-28 1 views
5

既存のObjective-Cプロジェクトにスウィフトコードを追加します。私は既存のプレフィックスヘッダーから定義を参照する際に問題があります。swiftのプレフィックスヘッダーからの参照クラス定義

@interface MyClass 
+(instancetype)myClass; 
-(void)doStuff; 
@end 

および.M:

@implementation MyClass 
+ (instancetype) myClass 
{ 
    // More to it than this, but this illustrates the setup 
    return [[MyClass alloc] init]; 
} 

- (void)doStuff 
{ 
    // Do something interesting 
} 
@end 

プレフィックスヘッダMyProj-Prefix.pchが含ま:

IはMyClassのと呼ばれるクラスの.hとObjective-Cで定義されてい

#define MYCLASS MyClass 
#define SOMEVAR @"Hello" 

ブリッジヘッダを作成しました。

#import "MyProj-Prefix.pch" 

このプロジェクトには、クラス定義を使用するObjective-Cコードが含まれています。

[[MYCLASS myClass] doStuff]; 

私は新しいスウィフトコードでこれをミラーリングしたいと思います。 I 定義された変数を参照して参照できますが、定義されたクラスは表示されません。例えば

let someStr = SOMEVAR // This compiles 
MYCLASS.myClass.doStuff() // MYCLASS isn't visible 

どのようにこれを達成するための指針ですか?これが迅速に可能かどうかはわかりません。

答えて

1

この問題は、#define MYCLASS MyClassが他のヘッダーにあっても、プレフィックスヘッダーにあるとは限りません。プリプロセッサディレクティブは一般的にSwiftにインポートされないためです。ただし、グローバル定数にマップできる場合は、SOMEVARでは可能ですが、MYCLASSではマッピングできない場合、シンプルマクロはインポートされます。 https://developer.apple.com/library/content/documentation/Swift/Conceptual/BuildingCocoaApps/InteractingWithCAPIs.html#//apple_ref/doc/uid/TP40014216-CH8-ID17を参照してください。一つは、グローバルスコープでスイフトでtypealiasを使用することができ

:もちろん

typealias MYCLASS = MyClass 

MYCLASSヘッダに再定義されている場合、typealiasは変更されなければなりません。

MYCLASSの定義がコードの作成場所によってどのように変わるかは、残念ながら、このアプローチはあまり役に立ちません。しかし、コードでは、MYCLASSとして定義できるさまざまなクラスに共通の振る舞いについてかなり知っている必要があるため、ここではプロトコルを使用することができます。

更新: これについてもう少し考えてみたり、他の投稿を読んだりしてください。 Using obj-c typedef in Swift、これは良い解決策です、と私は思います。 Objective-CのMYCLASS#define dの場合、この方法でSwiftコードを変更する必要はありません。

あなたのObjective-Cコードのどこかに。ブリッジングヘッダで、その後、あなたはスウィフトに次のようなことを行うことができます

typedef MYCLASS * _MYCLASS; 

追加:

_MYCLASS.myClass().doStuff() 

あなたが本当にでtypealias MYCLASS = _MYCLASSを追加し、何らかの理由でスウィフトでMYCLASSを使用して主張する場合をスウィフトコードがそのトリックを行います。