iphone - не могу удалить объекты из массива - PullRequest
1 голос
/ 20 марта 2011

Мое приложение почти завершено, но у меня возникла проблема. Я не могу удалить объекты из созданного мной массива.

Это пример моего кода:

-(void) TheGame{

  squares = [[NSMutableArray arrayWithObjects: @"a", @"b", @"c", @"d", @"e", @"f", @"g", @"h" ,@"i" ,@"j", @"k", @"l", @"m", @"n", @"o", @"p", @"q", @"r", @"s", @"t", @"aa", @"bb", @"cc",@"dd", @"ee", @"ff", @"gg", @"hh", @"ii", @"jj", @"kk", @"ll", @"mm", @"nn", @"oo", @"pp", @"qq",@"rr", @"ss", @"tt", nil] retain];

  s=40;
  turn=1;

  while(s >= 1)
    if (turn == 1){
      //Check for players move
      //Here I added some if statement, and for every one I added 
      //[squares removeObject: @"b"]; X can be any object of the array.
      turn = 0;
      s = s - 1;
    }

  if (turn == 0){

    //Here the computer should find an object from the array randomly. I used
    //randomN = [squares objectAtIndex:arc4random() % [squares count]];
    //to choose the random object.

    //After choosing, the item should be removed from the array, also using
    //[squares removeObject: @"X"]; X can be any object of the array.

    turn = 1;
    s = s - 1;
  }
}

Проблема, например, в том, что если игрок выбирает объект «b» из массива, то должен срабатывать

[squares removeObject: @"b"];

.

когда дело доходит до компьютера случайным движением, возникаетвероятность того, что он выберет тот же объект, который уже был удален из массива, в моем примере это @ "b".

Это означает, что элементы не удаляются из массива, когда

[squares removeObject: @"X"];

срабатывает.

У кого-нибудь есть решения этой проблемы?

Пожалуйста, мне нужна ваша помощь.

======= Решено ========

Я пытался использовать ваши ответы, но не смог решить проблему ..

Решение было настолько простым: p .. Просто переместил массив в "viewDidLoad ".

Спасибо, ребята, за вашу помощь, извините, но я не могу принять ответы как неработающие для меня.Я ценю ваши усилия.

Ответы [ 3 ]

2 голосов
/ 21 марта 2011

Вы можете попробовать использовать indexOfObject: затем removeObjectAtIndex: для удаления элемента из массива.

Я подозреваю, что если вы отладите, indexOfObject может дать вам результат NSNotFound (очень большое число), что означает, что дляпо какой-то причине он может подумать, что массив не содержит строку, которую вы передаете. Очень вероятно, что что-то в строке, которую вы передаете, чтобы удалить запись из массива, не соответствует эквивалентной записи в массиве.

1 голос
/ 21 марта 2011

Ваш первоначальный вопрос неясен, но я думаю, что у вас есть проблемы со старой проблемой ссылок на указатели.

Ниже приведен типичный пример двух одинаковых строк, но не точно одинаковых:

if (@"bears" == @"bears")
{

}

выше сравниваются только указатели, а не строки. Сказать что-то вроде [squares removeObject:@"b"]; неверно, потому что вы выделяете новую строку (b), а затем говорите своему массиву; «удалить объект, на который ссылается этот указатель», когда вы ожидаете «удалить объект, содержащий в себе b» (это не так, как работают массивы).

tl; dr, используйте словарь.

1 голос
/ 21 марта 2011

Я бы использовал NSMutableDictionary вместо Array, чтобы у вас был прямой доступ для добавления / удаления и т. Д. *

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...