Я написал эту функцию, которая перетасовки содержимого NSString
, и, похоже, она работает, но время от времени она падает. Это может быть обходным путем, но я помещаю символы в массив, произвольно меняю элементы в массиве и затем возвращаю массив обратно в строку.Перемешивание писем в NSString в Objective-C
Я не уверен, что я делаю, что это небезопасно, что приводит к его сбою. Я думал, что это возможно, что я устанавливаю finalLettersString = result
, но я также пробовал finalLettersString = [NSString stringWithString:result]
, и это также приводит к сбоям. Причина, по которой я запутался, заключается в том, что она не падает каждый раз. Я просто нажимаю кнопку тасования, и иногда он падает. В каких местах я должен смотреть?
/* This function shuffles the letters in the string finalLettersString */
-(IBAction)shuffleLetters:(id)sender{
int length = [finalLettersString length];
NSMutableArray * letters = [NSMutableArray arrayWithCapacity:length];
NSLog(@"final letters: %@", finalLettersString);
for(int i = 0; i < length; i++){
char ch = [finalLettersString characterAtIndex:i];
NSLog(@"%c", ch);
NSString * cur = [NSString stringWithFormat:@"%c", ch];
[letters insertObject:cur atIndex:i];
}
NSLog(@"LETTERS:: %@", letters);
for(int i = length - 1; i >= 0; i--){
int j = arc4random() % (i + 1);
//NSLog(@"%d %d", i, j);
//swap at positions i and j
NSString * str_i = [letters objectAtIndex:i];
[letters replaceObjectAtIndex:i withObject:[letters objectAtIndex:j]];
[letters replaceObjectAtIndex:j withObject:str_i];
}
NSLog(@"NEW SHUFFLED LETTERS %@", letters);
NSString * result = @"";
for(int i = 0; i < length; i++){
result = [result stringByAppendingString:[letters objectAtIndex:i]];
}
NSLog(@"Final string: %@", result);
finalLettersString = result;
finalLetters.text = finalLettersString;
}
Спасибо! Определенно намного лучшее решение. Одна из проблем на самом деле заключалась в том, что вы не можете использовать NSUIntegers, потому что - на 0 приводит к действительно большому числу, а не -1, так как без него. Я получил его для работы с использованием ints и сохранения. В этой ситуации, как вы думаете, предпочтительнее сохранить или выделить явно? – jkeesh
@jkeesh: Хорошая мысль о целых числах без знака. Что касается выделения явно, это зависит от целевой платформы. Если вы ориентируетесь на iPhone, некоторые говорят, чтобы избежать пула автозапуска, когда вы можете это сделать элегантно, но для Mac OS X (т. Е. Систем с гораздо большим объемом памяти, чем iPhone) это не будет иметь заметной разницы. Лично я всегда выделяю явно, а не противопоставляю 'autorelease' с' keep', но результат тот же самый. – dreamlax
В этот день и эпоху интернационализации вы не можете предположить, что один unichar отображает один символ. – JeremyP