【问题标题】:Use of unresolved identifier 'PKCS7_type_is_signed'使用未解析的标识符“PKCS7_type_is_signed”
【发布时间】:2016-07-17 17:26:09
【问题描述】:

我正在快速编写收据验证代码,但 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

【问题讨论】:

  • 你为什么不直接写包装?

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


【解决方案1】:

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

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

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

【讨论】:

  • 谢谢,扩展宏在早上似乎是一件显而易见的事情 - 我可能应该停止工作到午夜 :-)
【解决方案2】:

来自苹果 将 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

【讨论】:

    猜你喜欢
    • 2018-03-12
    • 1970-01-01
    • 1970-01-01
    • 2016-02-25
    • 2016-04-29
    • 2017-02-27
    • 2020-12-09
    相关资源
    最近更新 更多