我在swift中写了收据验证码,但是我遇到了PKCS7_type_is_signed宏的问题: 使用未解析的标识符' PKCS7_type_is_signed'
除了为这个宏创建Objective-C包装外,有没有办法在Swift中使用它?
Wrapper看起来像这样:
#import "OpenSSLWrapper.h"
#import "openssl/pkcs7.h"
#import "openssl/objects.h"
@implementation OpenSSLWrapper
+ (BOOL)PKCS7TypeIsSigned:(PKCS7*)bio{
return PKCS7_type_is_signed(bio);
}
@end
答案 0 :(得分:2)
宏在Swift中不起作用。你必须写一个包装器。
Swift无法从宏中识别类型信息。什么样的参数应该允许Swift编译器传递到该宏?因为它无法辨别,所以不会编译它。
它也可能值得一提的是,在C / Objective-C中,这些宏很简单。更换。在编译之前扩展宏。如果这个宏确实扩展了,它几乎肯定会扩展到不会在.swift文件中编译的代码。
答案 1 :(得分:1)
来自苹果 将Swift与Cocoa和Objective-C一起使用
复杂的宏用于C和Objective-C但没有对应的 在斯威夫特。复杂的宏是不定义常量的宏, 包括带括号的函数式宏。您使用复杂的宏 在C和Objective-C中避免类型检查约束或避免 重新输入大量的样板代码。但是,宏可以做 调试和重构很困难。在Swift中,您可以使用函数 和泛型,以达到相同的结果,没有任何妥协。 因此,C和Objective-C源代码中的复杂宏 您的Swift代码无法使用这些文件。
正如nhgrif所指出的那样(谢谢:-)),这里有2个选项使用包装器或只是展开宏。
展开微距:
# define PKCS7_type_is_signed(a) (OBJ_obj2nid((a)->type) == NID_pkcs7_signed)
func PKCS7_type_is_signed(pkcs:UnsafeMutablePointer<PKCS7>)->Bool{
return OBJ_obj2nid(pkcs.memory.type) == NID_pkcs7_signed
}
func PKCS7_type_is_data(pkcs:UnsafeMutablePointer<PKCS7>)->Bool{
return (OBJ_obj2nid(pkcs.memory.type) == NID_pkcs7_data)
}
包装:
.h文件:
#import <Foundation/Foundation.h>
#import "openssl/pkcs7.h"
#import "openssl/objects.h"
@interface OpenSSLWrapper:NSObject
+ (BOOL)PKCS7TypeIsSigned:(PKCS7*)bio;
+ (BOOL)PKCS7TypeIsData:(PKCS7*)contents;
@end
.m文件:
#import "OpenSSLWrapper.h"
@implementation OpenSSLWrapper
+ (BOOL)PKCS7TypeIsSigned:(PKCS7*)bio{
return PKCS7_type_is_signed(bio);
}
+ (BOOL)PKCS7TypeIsData:(PKCS7*)contents{
return PKCS7_type_is_data(contents);
}
@end