Сравните свойства 2 экземпляров из метода внешнего класса - необходим для карточной игры iPhone - PullRequest
0 голосов
/ 04 мая 2011

Я реализую карточную игру для iphone. В моем модельном классе каждая карта имеет N атрибутов.

@interface Card : NSObject {

    NSInteger attribute1;
    NSInteger attribute2;
        ....................;

    NSInteger attributeN;
}

Я хочу создать класс контроллера, который сравнивает 2 карты для атрибута, который пользователь выбирает из интерфейса. Проблема в том, что я не знаю, как ссылаться на атрибуты внешней карты по классу Controller.

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

- (Player) winnerOfComparisonBetween:(Card *) card1 andCard:(Card *) card2 forAttribute:??? {
    if (card1.selectedAttribute** < card2.selectedAttribute)
         return card1.owner

     ....
     ....
}

Любые идеи о том, как реализовать этот метод, и что поставить вместо вопросительных знаков? Любая помощь будет очень признательна.

Ответы [ 2 ]

2 голосов
/ 04 мая 2011

Посмотрите на executeSelector и NSSelectorFromString в NSObject.

Попробуйте что-то вроде этого:

- (Player)winnerOfComparisonBetween:(Card *)card1 andCard:(Card *)card2 forAttribute:(NSString *)attributeName {

    SEL selector = NSSelectorFromString(attributeName);
    id a = [card1 performSelector:selector];   
    id b = [card2 performSelector:selector];

    NSComparisonResult result = [a compare:b];

    if (NSOrderedAscending == result)
        return card1.owner;
    else if (NSOrderedDescending == result)
        return card2.owner;
    else
        NSLog(@"They're the same");
}

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

Если также предполагается, что все атрибуты являются объектами, т. Е. У вас не может быть чисел с плавающей запятой или целых, вы должны иметь номера NSNumbers.

И нет никакой проверки ошибок, чтобы сделать его более читабельным - вам нужно убедиться, что attributeName является допустимым именем для атрибута, или он может произойти сбой - взгляните на respdsToSelector: чтобы проверить, могут ли объекты вашей карты выполнять селектор:)

0 голосов
/ 04 мая 2011

Используйте это, если у вас все еще есть проблемы, дайте мне знать ...:)

- (Player) winnerOfComparisonBetween:(Card *) card1 andCard:(Card *) card2 forAttribute:(NSInteger)attribute {


    switch (attribute) {
        case attribute1:
            if (card1.attribute1 < card2.attribute1)
                return card1.owner
                }
            break;


        case attribute2:
            if (card1.attribute2 < card2.attribute2)
                return card1.owner
                }
            break;


        .
        .
        .
        .
        .

        case attributeN:
            if (card1.attributeN < card2.attributeN)
                    return card1.owner
                }
            break;


        default:
            break;
}
...