2

我正在尝试为Card将单个卡与数组进行比较的类编写实例方法。该类具有一些属性,例如:shapecolor. otherCards数组中填充了此类的其他实例,它们也有它们的shapes 和colors。

现在,我想编写一个可以分别检查所有这些属性的方法。如何传递特定属性,如:[allAttributesIsEqual:otherCards compareWith: self.shape]?所以我可以传入self.shapeself.color实际比较时?

- (BOOL)allAttributesIsEqual: (NSArray *)otherCards
{
    //self.shape is equal to othercards.shape
}
4

2 回答 2

3

你不能只传入self.shape,因为这会给你财产的价值。不过,感谢 Cocoa/ObjC 的一些 dynamite,您可以传入属性(或方法)的名称并稍后获取结果。

聪明的(我敢说,甚至可能是“Pythonic”)方式:

// The name of the property we're interested in.
NSString * key = @"color";
// Get the values of that property for all the Cards in the array, then
// collapse duplicates, because they'll give the same results when comparing
// with the single card.
NSSet * vals = [NSSet setWithArray:[arrayOfCards valueForKey:key]];
// Now, if the set has only one member, and this member is the same
// as the appropriate value of the card we already have, all objects
// in the array have the same value for the property we're looking at.
BOOL colorIsEqual = ([vals count] == 1 && [vals containsObject:[myCard valueForKey:key]]);

然后你的方法可以如下所示:

- (BOOL)allOtherCards: (NSArray *)otherCards haveEqualAttribute: (NSString *)key;

然而, Dan F 建议为- (BOOL)<#property#>Equal: (NSArray *)otherCards;您感兴趣的每个属性实施这一点并不是一个坏主意。当然,这些中的每一个都可以调用基本的“聪明”版本。

于 2013-02-15T21:03:49.093 回答
2

这个想法是您(作为 Card 类)知道两个实例“相等”意味着什么。听起来在您的情况下,如果两张卡片的颜色和形状属性匹配,则它们是等效的。首先在您的自定义 Card 类上实现-isEqual:(连同)。-hash这是让一个对象公开它是否与其他对象相同的概念的标准方法。您可以根据需要执行此操作。在此isEqual方法中,您可以检查所有相关属性:

- (BOOL)isEqual:(id)otherObject
{
    if (![otherObject isKindOfClass:[self class]) {
        return NO;
    }
    Card * otherCard = (Card *)otherObject;
    // now compare the attributes that contribute to "equality"
    return ([self.shape isEqual:otherCard.shape] && [self.color isEqual:otherCard.color]);
}

现在,一旦您的自定义对象支持此 -isEqual:,您就可以检查数组中的所有卡片以查看是否有任何卡片与候选卡片相等。您可以自己执行循环并使用 -isEqual:,但是以系统标准方式执行此操作的好处是您还可以使用系统提供的便捷方法来检查集合成员资格,例如:

if ([myCardList containsObject:candidateCard]) {
    // one of the cards compared as "equal"
}

如果您希望在类的方法中请求时执行此操作,则可以像这样构造它:

- (BOOL)isRepresentedInArray:(NSArray *)arr
{
    return [arr containsObject:self];
}
于 2013-02-15T20:54:16.717 回答