我创建了一个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框架中使用。
所以这花了一段时间,但我终于在我的设备上运行了一些东西。这是我的设置。我创建了一个名为swiftlib的Swift框架。我添加了一个名为“ MyClass”的Objective-C类。基本上看起来像这样:
然后,我修改了“伞头”以导入新的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>
确保将标头类设置为public,否则会出现编译错误。基本上,伞头中包含的所有内容都向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
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句