Обмен объектами с Objective C - PullRequest
2 голосов
/ 01 июля 2010

Я хочу поменять место, на которое указывает игрок. Я точно делаю это неправильно, но не могу понять, почему. Я также пытался использовать (Player **) player в подписи и & player, когда я звонил. Есть идеи?

- (void)handleResult:(Result)result forPlayer:(Player *)player inLineup:(Lineup *)lineup
{
    switch (result)
    {
        case ResultSub:
        {
            Player *sub = [lineup.substitutes objectAtIndex:0];
            player = sub;
            return;
            break;
        }
    }
}

Ответы [ 2 ]

13 голосов
/ 01 июля 2010

Хотя Карл и прав, это почти точно то, что вы не хотите делать.

А именно, в Какао или iOS исключительно редко передаются значения по ссылке с целью их дистанционного обновления.,Помимо того, что он хрупок и подвержен ошибкам, он также обычно является нарушением инкапсуляции, фундаментальным принципом ОО.

Учитывая контекст, кажется, что вы делаете какое-то приложение типа бейсбола?Предположим, что так.

Таким образом, у вас есть класс Lineup, экземпляры которого представляют состав команды (возможно, даже класс команды, экземпляры которого представляют отдельные команды), причем каждая команда управляет составом экземпляров Player.

Итак, у вас может быть что-то вроде:

@interface Lineup:NSObject
- (BOOL) substitutePlayer: (Player *) sub;
@end

И вы можете назвать это так:

- (void)handleResult:(Result)result
           forPlayer:(Player *)player
            inLineup:(Lineup *)lineup
{
    ... handle substituion ...
    [lineup substitutePlayer: player];
}

И вы можете реализовать substitutePlayer: как:

- (BOOL) substitutePlayer: (Player *) playerToReplace;
{
    NSUInteger *index = [self.players indexOfObject: playerToReplace];
    [self.players replaceObjectAtIndex: index withObject: [self.substitutes objectAtIndex: 0]];
    [self.substitues removeObjectAtIndex: 0];

    return YES;
}

Делая это, вы избегаете глупостей (Player **) и инкапсулируете все манипуляции со строками внутри класса.Если вам когда-нибудь понадобится специализировать состав - скажем, -substitutePlayer: должен использовать последнего парня в self.substitutes - вы можете создать подкласс Lineup и сделать это.

Конечный результат;намного более чистый ОО-дизайн, гораздо более простой в обслуживании код и гораздо менее хрупкие шаблоны.

(Исправлены некоторые глупые ошибки из-за кодирования в окне редактирования SO).

3 голосов
/ 01 июля 2010

Вы были на ходу. Вам нужно иметь Player ** в качестве типа, вызывать его с &, а затем использовать * при выполнении назначения:

*player = sub; 

Это должно сделать это. Следите за управлением памятью.

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