使用valueForKey检查所有对象是否不相等的可重用方法

时间:2013-02-16 12:34:03

标签: objective-c compare

我一直在使用这种方法几个小时。它应该简单地检查作为otherCards传入的卡的属性是否等于该(自)类实例的相同属性。但我正在撕扯我的头发 - 这是假的结果

 (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");
    }

2 个答案:

答案 0 :(得分:1)

我自己发现了这个错误 if(countUnequalMatches == [values count])返回YES?:NO;

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

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

答案 1 :(得分: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;
}