Как преобразовать текст в дело верблюда в Objective-C? - PullRequest
6 голосов
/ 28 июля 2011

Я создаю небольшую утилиту, которая поможет мне сгенерировать код для приложения, которое я создаю. Мне нравится иметь константы для моих настроек NSUserDefaults, чтобы мой код был более читабельным и проще в обслуживании. Проблема в том, что создание констант для всего занимает некоторое время, поэтому я пытаюсь написать утилиту для генерации кода для меня. Я хотел бы иметь возможность ввести строку и преобразовать ее в случай верблюда, например:

- (NSString *)camelCaseFromString:(NSString *)input{
    return inputAsCamelCase;
}

Теперь входная строка может состоять из нескольких слов. Я предполагаю, что мне нужно какое-то регулярное выражение здесь, или, возможно, есть другой способ сделать это. Я хотел бы ввести что-то вроде этого:

@"scrolling direction"

или это:

@"speed of scrolling"

и получите что-то вроде этого:

kScrollingDirection

или это:

kSpeedOfScrolling

Как бы вы удалили пробелы и заменили символ, следующий за пробелом, заглавной версией?

Ответы [ 3 ]

14 голосов
/ 28 июля 2011
- (NSString *)camelCaseFromString:(NSString *)input
{
    return [NSString stringWithFormat:@"k%@", [[input capitializedString]stringByReplacingOccurrencesOfString:@" " withString:@""]];
}
  1. Прописать каждое слово.
  2. Удалить пробелы.
  3. Вставьте «k» в начале. (Не буквально, но упрощение с использованием stringWithFormat.)
1 голос
/ 05 февраля 2016

Просто используйте: @ "Это предложение" .capitalizedString; Становится: >> «Это предложение»

Заменить пробелы и манипулировать ...

Прописывает первый символ слова и опускает остальные буквы для каждого слова.

1 голос
/ 02 сентября 2015

В текущем принятом ответе есть ошибка. (также указано @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
...