Можно ли использовать класс Objective-C в моей библиотеке Swift framework?

Я создал Swift Framework, который я использую в нескольких проектах. Существует класс Objectivce-C, который я бы хотел использовать, поскольку его трудно переносить прямолинейным Swift. Допустим, что класс SFTest

@interface SFTest {
} 
+ (NString *)myMethod(NSString *data);
@end
@implementation SFTest
+ (NString *)myMethod(NSString *data) {
    // does some processing
    return processedData;
}
@end

Можно ли как-то использовать это в моем проекте Swift framework, и если да, то как? В моих исследованиях упоминается нечто, называемое перемычками заголовков, но что они не могут использоваться в структурах Swift.

Ответ 1

Итак, это заняло некоторое время, но у меня наконец-то появилось что-то, что можно было запустить на моем устройстве. Вот моя настройка. Я создал Swift Framework под названием swiftlib. Я добавил класс Objective-C под названием "MyClass". В основном это выглядит так:

введите описание изображения здесь

Затем я изменил "заголовок зонтика", чтобы импортировать мой новый класс Objective-C. Заголовок зонтика - это название вашего проекта быстрой библиотеки. Так что в моем случае это был "swiftlib.h". Это то, что находится в моем заголовочном файле зонтика:

//
//  swiftlib.h
//  swiftlib
//

#import <UIKit/UIKit.h>
#import "MyClass.h"

//! Project version number for swiftlib.
FOUNDATION_EXPORT double swiftlibVersionNumber;

//! Project version string for swiftlib.
FOUNDATION_EXPORT const unsigned char swiftlibVersionString[];

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

Обязательно установите класс заголовка общедоступным или вы получите ошибку компиляции. В принципе, все, что включено в заголовок зонтика, предоставляется пользователям вашей быстрой структуры, поэтому оно должно быть общедоступным. Выберите MyClass.h и откройте нужную панель данных и выберите раскрывающийся список здесь:

введите описание изображения здесь

Затем я использовал эту среду Swift в одном приложении просмотра для тестирования и смог использовать мой класс Objective-C в AppDelegate.swift следующим образом:

func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool {
        // Override point for customization after application launch.
        let test = MyClass.myMethod()
        print("test = " + String(test))
        return true
    }

Это скомпилировано и запущено на моем устройстве.

Для любопытных это был код реализации для Objective-C MyClass:

#import "MyClass.h"
#import <CommonCrypto/CommonCrypto.h>

@implementation MyClass

+ (NSString *)myMethod {
    NSString *key = @"test";
    NSString *data = @"mytestdata";
    const char *ckey = [key cStringUsingEncoding:NSASCIIStringEncoding];
    const char *cdata = [data cStringUsingEncoding:NSASCIIStringEncoding];
    unsigned char chmac[CC_SHA256_DIGEST_LENGTH];
    CCHmac(kCCHmacAlgSHA256, ckey, strlen(ckey), cdata, strlen(cdata), chmac);
    NSData *hmac = [[NSData alloc] initWithBytes:chmac length:sizeof(chmac)];
    NSString *hash = [hmac base64Encoding];
    return hash;
}

@end

Ответ 2

Сначала используйте целевой класс c в вашем стремительном проекте, вам нужно создать файл заголовка моста в этом файле, который вам нужно импортировать объектный класс c, а затем вы можете использовать этот класс в swift