Здесь возможны два варианта, которые не так быстро, как это возможно, и не (явно) создают копии исходной строки, что должно быть выгодно, поскольку вы сказали, что строка была большой.
Сначала используйте NSScanner
, чтобы повторить попытку прочитать первый символ в строке. Если цикл заканчивается до того, как сканер достиг конца строки, есть и другие символы.
NSScanner * scanner = [NSScanner scannerWithString:s];
NSString * firstChar = [s substringWithRange:[s rangeOfComposedCharacterSequenceAtIndex:0]];
while([scanner scanString:firstChar intoString:NULL]) continue;
BOOL stringContainsOnlyOneCharacter = [scanner isAtEnd];
Regex также является хорошим инструментом для решения этой проблемы, так как «символ следует любое количество повторений этого символа» в очень просто выражается с одной задней Справочно:
// Match one of any character at the start of the string,
// followed by any number of repetitions of that same character
// until the end of the string.
NSString * patt = @"^(.)\\1*$";
NSRegularExpression * regEx =
[NSRegularExpression regularExpressionWithPattern:patt
options:0
error:NULL];
NSArray * matches = [regEx matchesInString:s
options:0
range:(NSRange){0, [s length]}];
BOOL stringContainsOnlyOneCharacter = ([matches count] == 1);
Оба эти параметры правильно обрабатывают многобайтовые и скомпонованные символы; версия regex также не требует явной проверки пустой строки.
Ни одно из решений, представленных в то время, когда я пишу это, будет корректно работать для символов (глифов), которые состоят из более чем одного unichar. В зависимости от вашего варианта использования это может иметь значение. – Avi