【问题标题】:NSArray containsObject methodNSArray containsObject 方法
【发布时间】:2011-02-25 20:42:27
【问题描述】:

我有一个关于 xcode 编码的简单问题,但不知道为什么事情没有像我想的那样执行。我有一个对象数组(自定义对象)。我只想检查这个是否在数组中。我使用了以下代码:

NSArray *collection = [[NSArray alloc] initWithObjects:A, B, C, nil]; //A, B, C are custom "Item" objects
Item *tempItem = [[Item alloc] initWithLength:1 width:2 height:3];  //3 instance variables in "Item" objects
if([collection containsObject:tempItem]) {
    NSLog(@"collection contains this item");
}

我想上述检查会给我一个积极的结果,但事实并非如此。此外,我检查了创建的对象是否相同。

NSLog(@"L:%i W:%i H:%i", itemToCheck.length, itemToCheck.width, itemToCheck.height);
for (int i = 0, i < [collection count], i++) {
    Item *itemInArray = [collection objectAtIndex:i];
    NSLog(@"collection contains L:%i W:%i H:%i", itemInArray.length, itemInArray.width, itemInArrayheight);
}

在控制台中,这是我得到的:

L:1 W:2 H:3
collection contains L:0 W:0 H:0
collection contains L:1 W:2 H:3
collection contains L:6 W:8 H:2

显然tempItem 位于collection 数组中,但是当我使用containsObject: 检查它时,什么也没有出现。谁能给我一些指导,我错了哪一部分?非常感谢!

【问题讨论】:

    标签: iphone arrays xcode compare


    【解决方案1】:

    [NSArray containsObject:] 的文档说:

    该方法判断是否 anObject 存在于接收器中 向每个人发送 isEqual: 消息 接收者的对象(和传递 anObject 作为每个参数的参数 isEqual: 消息)。

    问题是您正在比较对对象的引用而不是对象的值。要使这个特定的示例工作,您需要向[collection containsObject:] 发送它包含的变量的实例(例如ABC),或者您需要覆盖[NSObject isEqual:] 方法在你的Item 班级中。

    这就是您的 isEqual 方法可能的样子:

    - (BOOL)isEqual:(id)other {
        if (other == self)
          return YES;
        if (!other || ![other isKindOfClass:[self class]])
          return NO;
        if (self.length != other.length || self.width != other.width || self.height != other.height)
          return NO;
        return YES;
    }
    

    为了更好的实现,你可能想看看这个question

    【讨论】:

    • 哦,对不起,只是“水果”的拼写错误,应该是“项目”。你的意思是通过 containsObject: 比较自定义类对象不起作用吗?
    • 它确实有效,它只是默认使用对您的自定义对象的引用进行比较。如果您想让tempItem 等于上面示例中的A,您只需在您的类上创建isEqual 方法。
    • @Anthony,这样想:提供默认比较的NSObject 怎么知道如何为您的自定义类定义相等性?它应该考虑哪些属性,哪些不应该考虑?
    • 好的,我明白了。抱歉这个愚蠢的问题,因为我还是计算机编程的新手。百万感谢老鹰和乔治!你们太棒了!我会试试的。再次感谢您的帮助!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多