4

我正在快速编写收据验证代码,但是 PKCS7_type_is_signed 宏有问题:使用未解析的标识符 'PKCS7_type_is_signed'

除了为此宏创建 Objective-C 包装器之外,还有什么方法可以在 Swift 中使用它?

包装器看起来像这样:

#import "OpenSSLWrapper.h"

#import "openssl/pkcs7.h"
#import "openssl/objects.h"

@implementation OpenSSLWrapper

+ (BOOL)PKCS7TypeIsSigned:(PKCS7*)bio{
    return PKCS7_type_is_signed(bio);
}

@end
4

2 回答 2

2

来自 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
于 2016-03-30T08:27:22.713 回答
2

该宏在 Swift 中不起作用。您必须编写一个包装器。

Swift 无法从宏中辨别类型信息。Swift 编译器应该允许将什么样的参数传递给该宏?因为它不能辨别,所以它不会编译它。

值得一提的是,在 C/Objective-C 中,这些宏是简单的查找和替换。宏在编译前展开。如果这个宏确实展开了,它几乎肯定会展开成不会在 .swift 文件中编译的代码。

于 2016-03-29T22:53:09.717 回答