Метод извлечен из производственного кода и изменен для использования цветов для этого примера.Предполагается, что в строку входит текстовое имя цвета из какого-либо внешнего источника.Это имя входящего цвета сопоставляется с известными именами цветов Crayola в системе.Если новое имя цвета совпадает с какими-либо известными строками имени цвета Crayola, возвращается числовое значение для шестнадцатеричного кода HTML, эквивалентное этому имени цвета Crayola.
Первое использование http://www.unit -conversion.info / texttools /crc / и введите все известные названия цветов Crayola, чтобы получить числовые эквиваленты.Они будут использованы в заявлениях по делуЗатем поместите эти значения в перечисленные для чистоты (например, LivingColors
ниже).Эти числа становятся эквивалентными фактической строке имени цвета.
Затем во время выполнения текст переменной передается через ту же функцию, но внутреннюю для вашего кода, для генерации числовой константы того же типа.Если числовая константа из кода соответствует статически сгенерированной константе, то представляемые ими текстовые строки в точности равны.
Функция внутреннего кода crc32()
найдена в zlib.h
.Это генерирует уникальное число на основе текста, пропущенного через него, как конвертер веб-страницы выше.Уникальный номер из crc32()
может затем использоваться в общем операторе C switch()
для сопоставления с известными цветами, которые были предварительно обработаны в числа в перечисляемом.
Чтобы использовать встроенную системную функцию crc32()
для генерации значений CRC32B, включите /usr/lib/libz.1.dylib
в свой проект для компоновки.Не забудьте включить или #import <zlib.h>
в ваш источник, который ссылается на crc32()
Реализовать категорию Objective C для NSString
, чтобы родной класс NSString
понимал сообщения crc32:
и htmlColor:
.
Наконец, прочитайте / получите название цвета в объекте NSString
, затем отправьте строку в сообщение htmlColor:
, она переключается в соответствии со «строками» и возвращает шестнадцатеричное эквивалентное значение HTML дляИмя цвета Crayola.
#import <zlib.h>
#define typedefEnum( enumName ) typedef enum enumName enumName; enum enumName
/**
@see Crayola Web Colors https://www.w3schools.com/colors/colors_crayola.asp
@see CRC32B value generator for static case strings http://www.unit-conversion.info/texttools/crc/ or http://www.md5calc.com
*/
#define typedefEnum( enumName ) typedef enum enumName enumName; enum enumName
typedefEnum( LivingColors ) {
kRedColor = 0xc22c196f, // "Red" is 0xED0A3F in HTML
kBlueberryColor = 0xfbefa670, // "Blueberry" is 0x4F86F7 in HTML
kLightChromeGreenColor = 0x44b77242, // "Light Chrome Green" is 0xBEE64B in HTML
kPermanentGeraniumLakeColor = 0xecc4f3e4, // "Permanent Geranium Lake" is 0xE12C2C in HTML
kIlluminatingEmeraldColor = 0x4828d5f2, // "Illuminating Emerald" is 0x319177 in HTML
kWildWatermelonColor = 0x1a17c629, // "Wild Watermelon" is 0xFD5B78 in HTML
kWashTheDogColor = 0xea9fcbe6, // "Wash the Dog" is 0xFED85D in HTML
kNilColor = 0xDEADBEEF // could use '0' but what fun is that?
};
// generates the CRC32B, same used to check each ethernet packet on the network you receive so it’s fast
- (NSUInteger) crc32 {
NSUInteger theResult;
theResult = (NSUInteger)crc32( 0L,
(const unsigned char *) [self UTF8String],
(short)self.length);
return theResult;
}
/// @return the HTML hex value for a recognized color name string.
- (NSUInteger) htmlColor {
NSUInteger theResult = 0x0;
LivingColors theColorInLivingColor = kNilColor;
theColorInLivingColor = (LivingColors) [self crc32];
// return the HTML value for a known color by effectively switching on a string.
switch ( theColorInLivingColor ) {
case kRedColor : {
theResult = 0xED0A3F;
}
break;
case kBlueberryColor : {
theResult = 0x4F86F7;
}
break;
case kLightChromeGreenColor : {
theResult = 0xBEE64B;
}
break;
case kPermanentGeraniumLakeColor : {
theResult = 0xE12C2C;
}
break;
case kIlluminatingEmeraldColor : {
theResult = 0x319177;
}
break;
case kWildWatermelonColor : {
theResult = 0xFD5B78;
}
break;
case kWashTheDogColor : {
theResult = 0xFED85D;
}
break;
case kNilColor :
default : {
theResult = 0x0;
}
break;
}
return theResult;
}
Для примера была создана категория Objective C для добавления двух методов к существующему классу Какао NSString
, а не к его подклассу.
Конечным результатом является то, что NSString
объект появляется , чтобы иметь возможность изначально получить значение CRC32B (очень удобно, кроме этого примера) и может по существу switch(
) настрока имени цвета, которая, возможно, поступила от пользователя, текстовый файл и т. д., чтобы идентифицировать совпадение намного быстрее, чем может произойти любое сравнение текстовой строки.
Быстрый, эффективный и надежный, этот подход легко может бытьадаптирован к любому типу переменного текста, соответствующего статическому тексту с известным значением.Помните, что контрольные суммы CRC32B генерируются побитовыми операциями, а оператор C switch использует побитовые операции, оптимизированные во время компиляции.Помните, что это быстро, потому что CRC32B - это высоко оптимизированная функция, используемая для проверки каждого пакета Ethernet, который получает ваш Mac / iPhone / iPad ... даже при загрузке файлов объемом в несколько гигабайт, таких как macOS Sierra.