Помимо несбалансированных скобок, доступ символ из NSString является более сложным, чем при использовании массива обозначения. Вам нужно использовать метод characterAtIndex:
. Вы можете оптимизировать свой код, вырвавшись из цикла, если палиндром невозможно, и вызов длины за пределами цикла for.
NSString *p = @"121";
NSInteger length = p.length;
NSInteger halfLength = (length/2);
BOOL isPalindrome = YES;
for (int i = 0; i < halfLength; i++) {
if ([p characterAtIndex:i] != [p characterAtIndex:length - i - 1]) {
isPalindrome = NO;
break;
}
}
Может быть желательно проверить регистр нечувствительно. Чтобы сделать это, сделайте строкой все строчные буквы перед циклом, используя метод lowercaseString
.
Как отметил Николай в комментариях, это будет работать только для строк, содержащих «нормальные» символы Unicode, что часто бывает неверным - например, при использовании UTF8 для иностранных языков. Если это возможно, используйте вместо этого следующий код, который проверяет составные последовательности символов, а не отдельные символы.
NSString *p = @"121";
NSInteger length = p.length;
NSInteger halfLength = length/2;
__block BOOL isPalindrome = YES;
[p enumerateSubstringsInRange:NSMakeRange(0, halfLength) options:NSStringEnumerationByComposedCharacterSequences usingBlock:^(NSString *substring, NSRange substringRange, NSRange enclosingRange, BOOL *stop) {
NSRange otherRange = [p rangeOfComposedCharacterSequenceAtIndex:length - enclosingRange.location - 1];
if (![substring isEqualToString:[p substringWithRange:otherRange]]) {
isPalindrome = NO;
*stop = YES;
}
}];
Ну, за одно ваше '{}' не сбалансированы. (Если вы получаете сообщение об ошибке при компиляции кода, вы всегда должны указать, что это такое - как написано, оказалось, что вы спрашивали о своей логике программы.) – geoffspear
Другим трюком было бы обратить вспять строку (хорошо документирована) и test 'isEqualToString' –
@RobvanderVeer Я не знаю, что реверсирование строки хорошо документировано. Можете ли вы предоставить ссылку? –