Проще говоря, я пытаюсь преобразовать макрос #define
в собственную структуру данных Swift. Просто не уверен, как и какой.
Подробнее
Я хотел бы попробовать и скопировать следующий #define
из Objective-C в 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
Очевидно, #define
не существует в Swift; поэтому я не ищу порт 1:1. В более общем смысле это просто дух.
Чтобы начать, я сделал enum
, называемый CryptoAlgorithm
. Я всего лишь поддерживаю два криптоалгоритма ради этого вопроса; но ничто не мешает мне продлить его дальше.
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' is not identical to 'CC_SHA1_CTX'
. Проблема в том, что CC_SHA1_Init
является a UnsafeMutablePointer<CC_SHA1_CTX> -> Int32
. Поэтому два типа возврата не совпадают.
Является ли enum
неправильным подходом? Должен ли я использовать дженерики? Если да, то каким образом должен быть создан общий? Должен ли я предоставить протокол, который как CC_MD5_CTX
, так и CC_SHA1_CTX
, а затем расширен и возвращается, что?
Все предложения приветствуются (кроме использования моста Objc).