Baralhar letras em um NSString em Objective-C
Escrevi esta função que embaralha o conteúdo de umNSString
, e parece funcionar, mas de vez em quando ele trava. Pode ser uma maneira indireta, mas eu coloco os caracteres em uma matriz, troco os elementos na matriz aleatoriamente e, em seguida, viro a matriz novamente em uma string.
Não sei se o que estou fazendo é inseguro, o que causa um acidente. Eu pensei que era possível que eu estivesse definindofinalLettersString = result
, mas eu também tenteifinalLettersString = [NSString stringWithString:result]
e isso também trava. A razão pela qual estou confuso é porque ele não falha sempre. Eu continuo pressionando o botão aleatório, e às vezes ele trava. Algum lugar que eu deveria procurar?
/* 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;
}