2011-01-25 30 views
12

Tôi đang cố triển khai một lớp con của NSMutableDictionary trả về nil thay vì ném một NSUndefinedKeyException khi khoá không có trong Từ điển.Phân lớp NSMutableDictionary

Tuy nhiên khi tôi cố gắng thêm đối tượng vào từ điển của tôi, tôi có được

[NSMutableDictionary setObject:forKey:]: method only defined for abstract class 

NilDictionary.h

@interface NilDictionary : NSMutableDictionary { 
} 
@end 

NilDctionary.m

@implementation NilDictionary 
- (id)valueForUndefinedKey:(NSString *)key { 
    return nil; 
} 
@end 

Tôi thực sự phải thực hiện tất cả các phương thức từ NSMutableDictionary một lần nữa trong phân lớp của tôi hoặc là có một số lớp khác tôi nên subclas hát?

Làm rõ: Sự cố ban đầu của tôi không thể đọc được tài liệu chính xác.

Nếu bạn cần phân lớp NSMutableDictionary, hãy kiểm tra câu trả lời đúng. Nếu bạn muốn một từ điển trả về nil khi khóa của bạn không có, NSMutableDictionary đã làm điều đó rồi.

+1

Chính xác bạn đang làm gì với một từ điển để khiến từ đó phát ra 'NSUndefinedKeyException'? Cố gắng truy cập một khóa không hợp lệ trong một từ điển sẽ tự động trả về 'nil' anyways; làm thế nào bạn nhận được lỗi này? –

Trả lời

25

NSMutableDictionary Class Reference nói:

Trong một lớp con, bạn phải ghi đè lên cả hai phương pháp nguyên thủy của nó:

1. setObject: forKey:
2. removeObjectForKey:

Bạn phải cũng ghi đè lên các phương thức nguyên thủy của lớp NSDictionary.


NSDictionary Class Reference nói:

Nếu bạn cần phải phân lớp NSDictionary, bạn cần phải đưa vào tài khoản được đại diện bởi một Class cluster -Có do đó một số phương pháp nguyên thủy khi mà các phương pháp được khái niệm dựa trên:

1. đếm
2. objectForKey:
3. keyEnumerator
4. initWithObjects: forKeys: đếm:

Trong một lớp con, bạn phải ghi đè lên tất cả các phương pháp này.

NSDictionary’s các phương thức khác hoạt động bằng cách gọi một hoặc nhiều trong số các nguyên thủy này. Các phương thức không nguyên thủy cung cấp các cách thuận tiện để truy cập nhiều mục cùng một lúc.


Có vẻ như bạn cần phải ghi đè tất cả sáu phương pháp để làm cho công việc NSMutableDictionary lớp con của bạn hoàn hảo.

+0

Bạn cũng phải ghi đè 'initWithObjects: forKeys: count:' –

4

Đây là vấn đề của bạn. NSDictionary (và đối tác có thể thay đổi) là một phần của cụm lớp (đọc thêm về chúng here, dưới tiêu đề 'Nhóm cụm') và không được phân loại vì nó gây ra các vấn đề như những gì bạn đã đề cập (đọc ghi chú con trong số NSDictionary Class Reference). Dù bạn cần làm gì, bạn sẽ có một cách để mở rộng các lớp bạn muốn sử dụng để làm những gì bạn muốn làm. Ví dụ, mã trên có thể dễ dàng được đặt trong một danh mục (đọc thêm về các loại here).

+0

Cảm ơn những người đứng đầu. Có vẻ như để phân lớp một Class Cluster tôi chỉ cần thực hiện tất cả các phương thức nguyên thủy. Đối với NSMutableDictionary điều này có nghĩa rằng tôi cũng cần phải viết một thực hiện đơn giản cho * đếm * objectForKey: * keyEnumerator * setObject: forKey: * removeObjectForKey: Tôi ngập ngừng sử dụng một loại bởi vì như tôi hiểu nó mà có thể ảnh hưởng đến việc sử dụng NSMutableDictionary trong ứng dụng của tôi? – Ben

+0

Ngoài ra, tôi không biết bạn đang làm gì sai, nhưng khi bạn cố gắng truy cập một khóa không tìm thấy trong từ điển, nó sẽ trả về 'nil'; nó không ném một 'NSUndefinedKeyException' ... chính xác là bạn đang cố gắng làm gì? –

+0

Cảm ơn. Có lẽ tôi nên thử nó thay vì tìm nó trong tài liệu. – Ben

-1

Bạn có chắc chắn bạn không nhận được ngoại lệ khi chuyển sang "không" cho một KEY (không phải là một giá trị)?

Các vấn đề liên quan