2010-05-31 25 views
16

Tôi có một câu hỏi đơn giản về mã hóa xcode nhưng không biết tại sao mọi thứ không hoạt động như tôi nghĩ. Tôi có một mảng các đối tượng (các đối tượng tùy chỉnh). Tôi chỉ muốn kiểm tra xem cái này có nằm trong mảng không. Tôi đã sử dụng mã sau:NSArray containsObject method

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

Tôi cho rằng việc kiểm tra ở trên sẽ cho tôi kết quả tích cực nhưng không. Hơn nữa, tôi đã kiểm tra xem các đối tượng được tạo có giống nhau hay không.

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

Trong giao diện điều khiển, đây là những gì tôi nhận:

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 

Rõ ràng là tempItem là bên trong các mảng collection nhưng không xuất hiện khi tôi sử dụng containsObject: để kiểm tra xem nó. Bất cứ ai có thể cho tôi một số hướng mà một phần tôi sai? Cảm ơn rất nhiều!

Trả lời

40

Các tài liệu cho [NSArray containsObject:] nói:

Phương pháp này sẽ xác định xem anObject hiện diện trong nhận bởi gửi isEqual: Thông điệp cho mỗi đối tượng của người nhận (và đi qua anObject như các tham số để mỗi isEqual: message).

Vấn đề là bạn đang so sánh tham chiếu đến đối tượng thay vì giá trị của đối tượng. Để làm ví dụ cụ thể này hoạt động, bạn cần phải gửi [collection containsObject:] một phiên bản của biến chứa (ví dụ: A, B hoặc C) hoặc bạn sẽ cần ghi đè phương thức [NSObject isEqual:] trong lớp Item của mình.

Đây là những gì phương pháp isEqual của bạn có thể trông giống như:

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

Đối với việc thực hiện tốt hơn, bạn có thể muốn xem xét question này.

+1

Ồ, xin lỗi, chỉ là lỗi đánh máy cho "Quả", nó phải là "Mục". Bạn có nghĩa là so sánh các đối tượng lớp tùy chỉnh bởi containsObject: không hoạt động? – Anthony

+2

Nó hoạt động, nó chỉ được so sánh mặc định bằng cách sử dụng một tham chiếu đến đối tượng tùy chỉnh của bạn. Nếu bạn muốn tạo 'tempItem' bằng' A' trong ví dụ trên, bạn sẽ chỉ cần tạo phương thức 'isEqual' trên lớp của bạn. – Senseful

+1

@Anthony, suy nghĩ về nó theo cách này: Làm thế nào có thể 'NSObject', cung cấp so sánh mặc định, biết cách bình đẳng được định nghĩa cho các lớp tùy chỉnh của bạn? Thuộc tính nào cần xem xét và thuộc tính nào? –