0

我已经使用这种方法几个小时了。它应该简单地检查作为otherCardsisEqual 传入的卡片的属性是否与这个(自我)类实例的相同属性。但我正在扯掉我的头发 - 它给出了错误的结果

 (BOOL)otherCards: (NSArray *)otherCards allHaveUnequalAttribute: (NSString *)key
{
    NSArray *values = [NSArray arrayWithArray:[otherCards valueForKey:key]];
    int countUnequalMatches = 0;

        for (NSNumber *setValue in values) {
            if (![[self valueForKey:key] isEqual:setValue]) {
                countUnequalMatches++;}
        }
    NSLog(@"countUnequalMatches %d values count: %d", countUnequalMatches, [values count]);

    if (countUnequalMatches == [values count]) return  YES ?: NO;
}

它是这样调用的:

 if ([self otherCards:otherCards allHaveUnequalAttribute:CARD_SHAPE]) {
        NSLog(@"All unequal");
    } else {
        NSLog(@"One or more card equal");
    }
4

2 回答 2

1

如果 (countUnequalMatches == [values count]) return YES ?: NO; 我自己发现了这个错误。

应该是: if (countUnequalMatches == [otherCards count]) return YES ?: NO;

因为我使用 Set 作为计算唯一项目的一种方式。

于 2013-02-16T13:19:22.360 回答
1

这是谓词非常适合处理的事情。

-(BOOL)otherCards: (NSArray *)otherCards allHaveUnequalAttribute: (NSString *)key
{
    NSPredicate *pred = [NSPredicate predicateWithFormat:@"%K == %@", key, [self valueForKey:key]];

    NSArray *equalCards = [otherCards filteredArrayUsingPredicate:pred];

    return equalCards.count == 0;
}
于 2013-02-16T13:31:26.027 回答