来自 Apples
Using Swift with Cocoa 和 Objective-C
复杂的宏在 C 和 Objective-C 中使用,但在 Swift 中没有对应物。复杂宏是不定义常量的宏,包括带括号的、类似函数的宏。您在 C 和 Objective-C 中使用复杂的宏来避免类型检查约束或避免重新输入大量样板代码。但是,宏会使调试和重构变得困难。在 Swift 中,您可以使用函数和泛型来获得相同的结果,而不会做出任何妥协。因此,您的 Swift 代码无法使用 C 和 Objective-C 源文件中的复杂宏。
正如 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