使用未解析的标识符' PKCS7_type_is_signed'

时间:2016-03-29 22:46:55

标签: objective-c c swift openssl receipt-validation

我在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

2 个答案:

答案 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