В текущем принятом ответе есть ошибка. (также указано @jaydee3)
Слова, уже имеющие правильные сокращения camelCasing, PascalCasing или TLA с заглавными буквами, будут иметь "уничтоженный" правильный регистр, если не первые символы будут в нижнем регистре при вызове capitalizedString
.
Таким образом, "I prefer camelCasing to PascalCasing for variables"
будет выглядеть как «iPreferCamel c asingToPascalcasingForVariables», но в зависимости от вопроса должно быть «iPreferCamel C asingToPascalCasingForVariables»
Используйте следующую категорию на NSString для создания неразрушающего кожуха верблюда и паскаля. Это также правильно оставляет ALL_CAPS слова / акронимы на месте, хотя это не было частью вопроса оригинала.
Аббревиатура в качестве первого слова для строки с верблюжьей оболочкой была бы странной. "WTH"
становится "wTH"
, что выглядит странно. Во всяком случае, это крайний случай, и не рассматривается. Однако, поскольку задающий вопрос задает префикс «k», тогда "k IBM"
становится "kIBM"
, что выглядит хорошо для меня, но выглядит как "kIbm"
с принятым в настоящее время ответом.
Использование:
NSString *str = @"K computer manufacturer IBM";
NSLog(@"constant: %@", str.pascalCased);
// "constant: kComputerManufacturerIBM"
Код категории (расширение класса).
@implementation NSString (MixedCasing)
- (NSString *)camelCased {
NSMutableString *result = [NSMutableString new];
NSArray *words = [self componentsSeparatedByString: @" "];
for (uint i = 0; i < words.count; i++) {
if (i==0) {
[result appendString:((NSString *) words[i]).withLowercasedFirstChar];
}
else {
[result appendString:((NSString *)words[i]).withUppercasedFirstChar];
}
}
return result;
}
- (NSString *)pascalCased {
NSMutableString *result = [NSMutableString new];
NSArray *words = [self componentsSeparatedByString: @" "];
for (NSString *word in words) {
[result appendString:word.withUppercasedFirstChar];
}
return result;
}
- (NSString *)withUppercasedFirstChar {
if (self.length <= 1) {
return self.uppercaseString;
} else {
return [NSString stringWithFormat:@"%@%@",[[self substringToIndex:1] uppercaseString],[self substringFromIndex:1]];
}
}
- (NSString *)withLowercasedFirstChar {
if (self.length <= 1) {
return self.lowercaseString;
} else {
return [NSString stringWithFormat:@"%@%@",[[self substringToIndex:1] lowercaseString],[self substringFromIndex:1]];
}
}
@end