【问题标题】:Can I use an Objective-C class in my Swift framework library?我可以在我的 Swift 框架库中使用 Objective-C 类吗?
【发布时间】:2016-12-12 12:43:46
【问题描述】:

我创建了一个在多个项目中使用的 Swift 框架。有一个我想使用的 Objectivce-C 类很难直接移植到 Swift 中。假设该类是 SFTest

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

我可以在我的 Swift 框架 项目中以某种方式使用它吗?如果可以,如何使用?我对此的研究提到了一种叫做桥接头的东西,但它们不能在 Swift 框架中使用。

【问题讨论】:

  • 我不想导入 CommonCrypto 以在 Swift 中使用。我只想在 Swift 框架中使用一个 Objective-C 类。我可以删除代码中的常见加密并使用更简单的示例。
  • 删除了对 CommonCrypto 的任何提及,因此用是或否回答应该更简单。

标签: ios objective-c swift


【解决方案1】:

所以这需要一段时间,但我终于在我的设备上运行了一些东西。这是我的设置。我创建了一个名为 swiftlib 的 Swift 框架。我添加了一个名为“MyClass”的 Objective-C 类。基本上是这样的:

然后我修改了“伞形标题”以导入我的新 Objective-C 类。伞形标题是您的 swift 库项目的名称。所以就我而言,它是“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>

确保将头文件类设置为公共,否则会出现编译错误。基本上,伞形标题中包含的任何内容都会向您的 swift 框架的用户公开,因此它需要公开。选择 MyClass.h 并打开右侧的详细信息栏并选择此处的下拉列表:

然后我在单视图应用程序中使用这个 Swift 框架进行测试,并且能够像这样在 AppDelegate.swift 中使用我的 Objective-C 类:

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

【讨论】:

  • 你拯救了我的一天^_^
  • 我已经拉头发好几个小时了。感谢您提供详细的解决方案!
  • 我没有尝试过,但我希望这适用于 ios 应用程序。我正在做的是我在另一个框架内使用框架......它给出了clang错误。任何帮助将不胜感激。包含目标 c 类的第一个框架构建良好。但是当我将它导入另一个框架时,它会生成一个clang错误。
  • 尚未成功。我也尝试了上述解决方案,但出现错误“在 FrAmeworkNAme 框架模块中包含非模块化标头”请帮帮我
  • 如果我想对最终用户隐藏这些头文件呢?我只希望我的框架在内部使用这些 Objective-c 文件。
【解决方案2】:

首先在您的 swift 项目中使用目标 c 类,您必须在该文件中创建桥接头文件,您必须导入目标 c 类,然后您可以在 swift 中使用该类

【讨论】:

  • 桥接头不适用于其应用到应用项目的框架。
猜你喜欢
  • 2018-06-17
  • 1970-01-01
  • 1970-01-01
  • 2021-07-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-07-23
相关资源
最近更新 更多