Swift framework - используйте ссылку на класс Swift в классе Objective-C - PullRequest
0 голосов
/ 08 октября 2018

Я создаю среду Swift, в которой мне нужно использовать класс Objective-C.Так что я прошел эту ссылку.Это публичный заголовок моего фреймворка:

#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 классов.Но я получаю:

Использование необъявленного идентификатора 'MPGlobal'

Примечание: Я добавил @objC до MPGlobal .

Ответы [ 2 ]

0 голосов
/ 08 октября 2018

измените настройку SWIFT_OBJC_INTERFACE_HEADER_NAME и сделайте ее одинаковой для разных целей.Для этого измените инструкцию, которая генерирует это свойство, с $ (SWIFT_MODULE_NAME) -Swift.h на $ (PROJECT_NAME) -Swift.h , как объяснено здесь

ПослеВыполните эту команду Clean Build Folder, нажав Alt и войдя в меню Product.Поскольку имя заголовка является общим для целей, теперь его можно один раз импортировать в файл .m ObjectiveC, и все цели могут извлечь выгоду из классов Swift.

Если после сборки все еще отображается ошибка, убедитесь, что заголовок может бытьдостиг из XCode Cmd, нажав на его имя.Он должен открыть файл, содержащий код, подобный следующему:

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

Если необходимо убедиться, что эти заголовки генерируются, откройте терминал и используйте эту команду

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

Вы должны увидетьодин заголовок для каждой цели

Другая проблема, которая произошла со мной после этих изменений, заключается в том, что он начал выдавать ошибки в коде ObjectiveC, которые я не затрагивал.Проблема была из-за позиции импорта, как сообщается здесь :

Именно там, где в верхней части файла .m вы импортируете скрытый заголовок моста,разница.Обычным признаком проблемы является то, что вы получаете ошибку компиляции «Неизвестное имя типа», где неизвестный тип является классом, объявленным в Objective-C.Решение состоит в том, чтобы #import файла .h, содержащего объявление для неизвестного типа, также в ваших файлах Objective C, прежде чем #import скрытый заголовок моста.Необходимость сделать это может раздражать, особенно если рассматриваемый файл Objective-C не нуждается в информации об этом классе, но он решает проблему и позволяет продолжить компиляцию.

На самомend код компилируется и запускается на устройстве и симуляторе!

оригинальный ответ

Также вы можете попробовать это, вам нужно было импортировать -Swift.h для обоихframework и цель приложения

Например:

#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"

Вы можете прочитать эту статью Как импортировать заголовок файла и проверять пути

0 голосов
/ 08 октября 2018

Вам необходимо импортировать <Target>-Swift.h файл.Это называется именем заголовка сгенерированного интерфейса Objective-C.

Вы можете найти его в настройках сборки вашей Target.

enter image description here

Этот файл автоматически генерируется компилятором и его необходимо импортироватьв файлах Objective-C.

...