Посмотрите на 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: чтобы проверить, могут ли объекты вашей карты выполнять селектор:)