NSArray和" If-statement"

时间:2014-08-29 04:27:59

标签: ios objective-c nsarray

我是开发应用程序的新手。我有一张NSArray,里面有2张图片。

imageOneArray = [NSArray arrayWithObjects:[UIImage imageNamed:@"White.png"], [UIImage imageNamed:@"Black.png"], nil];

我的问题是,有没有办法制作一个看起来像这样的“if语句”:

if ([imageOneArray = [UIImage imageNamed:@"White.png"]) {
    //DO SOMETHING
};

上面的代码给了我错误,我该如何解决?我究竟做错了什么?我能做些什么呢?

非常感谢任何帮助。

5 个答案:

答案 0 :(得分:5)

如果您需要检查数组是否包含对象,您应该使用

if ([imageOneArray containsObject:[UIImage imageNamed:@"White.png"]]) {
    //DO SOMETHING
};

在这里你应该注意,该数组检查包含发送-isEqual:到其对象的包含。因此,在UIImage -isEqual:上只会进行指针比较。由于YES提供的图片缓存机制,上述代码将返回+imageNamed:,但一般来说,它应返回NO。请考虑以下示例:

NSString *path = [[NSBundle mainBundle] pathForResource:@"White" ofType:@"png"];
UIImage *image1 = [UIImage imageWithContentsOfFile:path];
UIImage *image2 = [UIImage imageWithContentsOfFile:path];
NSArray *arr = @[image1];
BOOL contains1 = [arr containsObject:image1]; // YES
BOOL contains2 = [arr containsObject:image2]; // NO

请考虑以下带字符串的示例:

NSString *string1 = [NSString stringWithString:@"abc"];
NSString *string2 = [NSString stringWithString:@"abc"];
NSArray *arr = @[string1];
BOOL contains1 = [arr containsObject:string1]; // YES
BOOL contains2 = [arr containsObject:string2]; // YES

因此,您应该记住数组中对象的相等规则。在NSHipster上有关于这个主题Equality的精彩文章。

如果你需要检查数组是否相等到另一个数组,请使用

if ([imageOneArray isEqualToArray:@[[UIImage imageNamed:@"White.png"]]]) {
    //DO SOMETHING
};

查看NSArray class reference以了解何时可以使用数组

答案 1 :(得分:4)

您可以尝试以下方法,假设目标是检查数组是否包含名为" White"的图像。请注意,UIImage -imageNamed:不需要扩展名

if ([imageOneArray containsObject:[UIImage imageNamed:@"White"]]) {
    //DO SOMETHING
}

答案 2 :(得分:3)

您在代码中遇到了一些问题。

首先"="是一项任务,例如

  

myName = Joe

而" =="是比较

  

1 == 1 (true) 1 == 2 (false)

其次,一个数组包含多个对象,因此您必须经历并比较每个对象(或使用containsObject方法,其他答案包括)。你经常会用For循环来做到这一点。

UIImage* myImageToCompare = [UIImage imageNamed:@"White"];

for (int i=0; i<imageOneArray.count; i++) {
if ([imageOneArray objectAtIndex:i] == myImage){
...do something
}
}

答案 3 :(得分:2)

您在数组中使用containsObject -containsObject:使用-isEqual:比较对象,这通常是您想要的:例如,包含相同UNICODE字符的两个NSString对象将被视为相等,即使它们不是同一个对象。

答案 4 :(得分:1)

- (void)doStuff{
    UIImage * const targetImage = [UIImage imageNamed:@"White"];
    for (UIImage *currentImage in someArray /*replace someArray with your own*/) {
        if ([self image:targetImage isEqualTo:currentImage]) {
            // Do stuff
            break;
        }
    }
}

- (BOOL)image:(UIImage * const)firstImage isEqualTo:(UIImage * const)secondImage {
    NSData * const firstData = UIImagePNGRepresentation(firstImage);
    NSData * const secondData = UIImagePNGRepresentation(secondImage);
    return [data1 isEqual:data2];
}