0

Objective-C クラスを使用する必要がある Swift フレームワークを作成しています。だから私はこのリンクを通った。これは私のフレームワークの公開ヘッダーです:

#import <UIKit/UIKit.h>

//! Project version number for Test.
FOUNDATION_EXPORT double TestVersionNumber;

//! Project version string for Test.
FOUNDATION_EXPORT const unsigned char TestVersionString[];

// In this header, you should import all the public headers of your framework using statements like #import <Test/PublicHeader.h>

#import <arpa/inet.h>
#import <ifaddrs.h>
#import <netdb.h>
#import <sys/socket.h>
#import <MyTest/MPAppDelegateProxy.h>  

クラスMPAppDelegateProxyで、作成したクラスを使用する必要がSwiftあります。これは :

#import "MPAppDelegateProxy.h"
#import "MyTest.h"

@implementation MPAppDelegateProxy

+ (void)proxyAppDelegate {
    [MPGlobal MPLog:@"App delegate not set, unable to perform automatic setup." file:@"MPAppDelegateProxy.m" function:@"proxyAppDelegate" line:32];
// rest of code
}  

MPGlobalは私のSwiftクラスの 1 つです。しかし、私は得ています:

宣言されていない識別子「MPGlobal」の使用

注: MPGlobal@objCの前に追加しました。

4

2 に答える 2

0

SWIFT_OBJC_INTERFACE_HEADER_NAMEビルド設定を変更し、異なるターゲット間で同じにします。これを行うには、ここで説明されているように、このプロパティを生成する命令を$(SWIFT_MODULE_NAME)-Swift.h から $(PROJECT_NAME)-Swift.hに変更します。

Alt キーを押して [Product] メニューに移動し、この Clean Build Folder を実行した後。ヘッダーの名前はターゲット間で共有されるようになったため、一度 .m ObjectiveC ファイルにインポートでき、すべてのターゲットが Swift クラスの恩恵を受けることができます。

ビルド後もエラーが表示される場合は、その名前を Cmd クリックして XCode からヘッダーにアクセスできることを確認してください。次のようなコードを含むファイルを開く必要があります。

SWIFT_CLASS("_TtC27ProjectName_Summary11MyClass")
@interface MyClass : NSObject
- (nonnull instancetype)init OBJC_DESIGNATED_INITIALIZER;
@end

これらのヘッダーが生成されていることを確認する必要がある場合は、ターミナルを開いてこのコマンドを使用します

find ~/Library/Developer/Xcode/DerivedData -name "*Swift.h"

ターゲットごとに 1 つのヘッダーが表示されます。

これらの変更後に私に起こったもう 1 つの問題は、私が触れていない ObjectiveC コードでエラーが発生し始めたことです。ここで報告されているように、問題はインポートの位置が原因​​でした:

.m ファイルの先頭で、隠しブリッジ ヘッダーを #import すると、違いが生じる可能性があります。問題の通常の兆候は、「未知の型名」コンパイル エラーが発生することです。ここで、未知の型は、Objective-C で宣言されたクラスです。解決策は、非表示のブリッジ ヘッダーを #import する前に、不明な型の宣言を含む .h ファイルを Objective-C ファイルにも #import することです。特に問題の Objective-C ファイルがこのクラスについて知る必要がない場合、これを行う必要があるのは煩わしいかもしれませんが、問題を解決してコンパイルを続行できるようにします。

最後に、コードがコンパイルされ、デバイスとシミュレーターで実行されます。

元の答え

また、これを試すこともできます。フレームワークとアプリターゲットの両方に -Swift.h をインポートする必要がありました

例えば ​​:

#import <UIKit/UIKit.h>
#import <AVFoundation/AVFoundation.h>
#import <Foundation/Foundation.h>
#import "XLPagerTabStrip-Swift.h"
#import "RealmSwift-Swift.h"
...... // Add all frameworks, subclasses, and dependance ios frameworks
#import  "MyProject-Swift.h"

この記事を読むことができます ファイルヘッダーをインポートしてパスを確認する方法

于 2018-10-08T09:40:25.767 に答える