简单来说,我正在尝试将一个 #define
宏定义转换为一种原生的Swift数据结构。只是不确定应该如何转换和使用哪种数据结构。
细节
我想尝试复制以下Objective-C中的#define
到Swift中。来源:JoeKun/FileMD5Hash
#define FileHashComputationContextInitialize(context, hashAlgorithmName) \
CC_##hashAlgorithmName##_CTX hashObjectFor##hashAlgorithmName; \
context.initFunction = (FileHashInitFunction)&CC_##hashAlgorithmName##_Init; \
context.updateFunction = (FileHashUpdateFunction)&CC_##hashAlgorithmName##_Update; \
context.finalFunction = (FileHashFinalFunction)&CC_##hashAlgorithmName##_Final; \
context.digestLength = CC_##hashAlgorithmName##_DIGEST_LENGTH; \
context.hashObjectPointer = (uint8_t **)&hashObjectFor##hashAlgorithmName
显然,在Swift中不存在#define
,因此我不是在寻找1:1端口。更一般地说,只是它的精神。
首先,我创建了一个名为CryptoAlgorithm
的enum
。为了回答这个问题,我只关心支持两种加密算法;但是我应该没有阻止将其扩展到更多算法。
enum CryptoAlgorithm {
case MD5, SHA1
}
目前为止一切顺利。现在需要实现 digestLength
。
enum CryptoAlgorithm {
case MD5, SHA1
var digestLength: Int {
switch self {
case .MD5:
return Int(CC_MD5_DIGEST_LENGTH)
case .SHA1:
return Int(CC_SHA1_DIGEST_LENGTH)
}
}
再次强调,目前为止一切顺利。现在需要实现initFunction
。
enum CryptoAlgorithm {
case MD5, SHA1
var digestLength: Int {
switch self {
case .MD5:
return Int(CC_MD5_DIGEST_LENGTH)
case .SHA1:
return Int(CC_SHA1_DIGEST_LENGTH)
}
var initFunction: UnsafeMutablePointer<CC_MD5_CTX> -> Int32 {
switch self {
case .MD5:
return CC_MD5_Init
case .SHA1:
return CC_SHA1_Init
}
}
}
崩溃并烧毁。 'CC_MD5_CTX' 不同于 'CC_SHA1_CTX'
。问题在于 CC_SHA1_Init
是一个 UnsafeMutablePointer<CC_SHA1_CTX> -> Int32
。因此,这两个返回类型不同。
枚举
是否是错误的方法?我应该使用泛型吗?如果是这样,应该如何创建这个泛型?我应该提供一个协议,让 CC_MD5_CTX
和 CC_SHA1_CTX
扩展并返回它吗?
欢迎所有建议(除了使用Objc桥接)。
var initFunction: UnsafeMutablePointer<Void> -> Int32 { ... }
这个怎么样? - Code DifferentCC_MD5_Init
和CC_SHA1_Init
的定义? - Code Different