我可以使用在objective-c 类我 Swift 框架库吗?

发布时间: 2017/3/6 23:12:42
注意事项: 本文中文内容可能为机器翻译,如要查看英文原文请点击上面连接.

我已经创建了 Swift 框架,我在多个项目中使用。还有我想要在中使用的很难在直端口应 C 类 Swift 。让我们说这类是 SFTest

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

我某种程度上可以用这个在我 Swift 框架项目,如果是,如何?我对此的研究提到东西称为桥接标头,但是,他们不能使用在 Swift 框架。

解决方法 1:

所以这花了好一会儿,但我终于在我的设备上运行的东西。这里是我的设置。我创建了 Swift 框架,被称为 swiftlib。我添加了名为"MyClass"objective-c 类。基本上,它看起来像这样︰

enter image description here

我然后修改"伞头"来导入我新的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 和打开右侧的详细信息栏,然后选择这里的下拉列表中︰

enter image description here

然后,我用这 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
赞助商