2015-04-27 2 views
-1

Мой код выглядит правильно, но isEqual, используемый для сравнения двух объектов, не работает. Я новичок в iOS. нет большого количества ресурсов для проверки. [box2 isEqual: box1] всегда дает мне №, но он должен дать «Да». что-то не так в моем коде, пожалуйста, предложите мне правильную вещь. заранее спасибо. ожидая лучшего предложения.isEqual не работает должным образом в xcode

#import <Foundation/Foundation.h> 
@interface Box:NSObject 
{ 
    double length; // Length of a box 
    double breadth; // Breadth of a box 
    double height; // Height of a box 
} 
@property(nonatomic, readwrite) double height; // Property 

-(double) volume; 
//-(id)initWithLength:(double)l andBreadth:(double)b; 
@end 

@implementation Box 

@synthesize height; 

-(id)init 
{ 
    self = [super init]; 
    if(self) 
    { 
    length = 2.0; 
    breadth = 3.0; 
    } 

    return self; 
} 

-(double) volume 
{ 
    return length*breadth*height; 
} 

@end 
@class Box; 
int main (int argc, const char * argv[]) 
{ 
    NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init]; 
    Box *box1 = [[Box alloc]init]; // Create box1 object of type Box 
    Box *box2 = [[Box alloc]init]; 
    NSLog (@"hello world"); 
    box1.height = 5.0; 
    NSLog (@"%ld",[box1 volume]); 

    if([box2 isEqual:box1]) 
    { 
    NSLog(@"%b",[box2 isEqual:box1]); 
    } 
    [pool drain]; 
    return 0; 
} 
+0

Они не будут когда-либо равными, поскольку они представляют собой два разных экземпляра. – Desdenova

ответ

3

Вам необходимо переопределить метод isEqual в вашем объекте.

например. в вашем «поле @implementation»

- (BOOL)isEqual:(id)object 
{ 
    if ([object isKindOfClass:[Box class]]) { 
     Box*box = (Box*)object; 
     return self.height == box.height; // compare heights values 
    } 
    return [super isEqual:object]; 
} 
+1

Для разъяснения: Он должен делать то же самое с 'length' (или' width'). Однако я рекомендую добавить метод '-isEqualToBox:', потому что его нужно часто, и вы можете использовать его из '-isEqual:' без кастинга. –

+0

Спасибо @kabarga, но мне нужно знать, возможно ли это без переопределения? если возможно, то как? если его не вы можете объяснить, почему? – Chetak

+0

@ AminNegm-Awad: почти все правый. Это был просто пример. Он может добавить больше материала для сравнения, это зависит от его мнения, когда это правда. Я думаю, что чище использовать isEqual, так как вам не нужно добавлять дополнительный метод isEqualToBox в файл .h, если таковой имеется. – kabarga

0

isEqual: работает отлично и как задокументировано, но не так, как вы ожидали.

isEqual: является собственностью NSObject. Он возвращает YES, если два указателя объекта одинаковы, и NO, если они не являются. Если вы хотите получить другой результат, вам нужно переопределить isEqual для вашего класса Box. Обратите внимание, что аргумент isEqual: может быть что угодно, а не только Box, поэтому вам нужно быть осторожным.

Очевидно, что вы не должны объявлять свойства переменных экземпляра, поэтому приведенный ниже код предполагает это. Как будет написан ваш код, у вас будет некоторая путаница с высотой переменной экземпляра, высотой свойства и переменной экземпляра _height, которая даст вам головные боли. Он также предполагает, что вы не являетесь подклассом Box (например, у вас может быть цветная коробка, которая не должна быть равна Box с одинаковой шириной, высотой и шириной).

- (BOOL)isEqual:(id)other 
{ 
    if (! [other isKindOfClass:[Box class]]) return NO; 
    Box* otherBox = other; 
    return _length == other.length && _breadth == other.breadth 
      && _height == other.height; 
} 
Смежные вопросы