2011-01-25 48 views
12

我想實現一個NSMutableDictionary的子類,它返回nil而不是在字典中不存在鍵時拋出一個NSUndefinedKeyException。Subclassing NSMutableDictionary

然而,當我嘗試將對象添加到我的字典裏,我得到

[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 

難道我真的要實現所有NSMutableDictionary中的方法再次在我的子類或有其他一些類我應該是subclas唱?

澄清:我原來的問題歸咎於我無法正確閱讀文檔。

如果您需要子類NSMutableDictionary檢查出正確的答案。如果你想要一個當你的密鑰不存在時返回nil的字典,NSMutableDictionary已經做到了。

+1

你到底在幹什麼用字典來引發一個`NSUndefinedKeyException`?嘗試訪問字典中的無效鍵會自動返回`nil`;你怎麼得到這個錯誤? – 2011-01-25 04:21:21

回答

25

NSMutableDictionary Class Reference說:

在子類中,必須覆蓋在它的兩個原始的方法:

1的setObject:forKey:
2. removeObjectForKey:

你必須也覆蓋了NSDictionary類的原始方法。


NSDictionary Class Reference說:

如果你需要繼承NSDictionary,你需要考慮到,由Class cluster代表的帳戶 - 有賴以方法是基於概念,因此一些原始的方法:

1.計數
2. objectForKey:
個3. keyEnumerator
4. initWithObjects:forKeys:數:

在子類中,你必須覆蓋所有這些方法。

NSDictionary’s其他方法通過調用這些基元中的一個或多個來操作。非原始方法提供了一次訪問多個條目的便捷方式。


看來你需要覆蓋所有這六個方法,讓您NSMutableDictionary子類的工作完美。

4

這是你的問題。 NSDictionary(及其可變對象)是類集羣的一部分(請在'類集羣'標題下閱讀更多關於它們的文章here),並且不應該進行子類化,因爲它會導致問題,例如您提到的內容(請參閱子類註釋在NSDictionary Class Reference)。無論你需要做什麼,你都會有一種方法來擴展你想要使用的類,以便做你想做的事。例如,上面的代碼可以很容易地放在一個類別(閱讀更多關於類別here)。

+0

謝謝你的擡頭。看來,爲了創建一個類集羣我只需要實現所有的基本方法。對於的NSMutableDictionary這意味着我還需要編寫一個簡單的實施 *算* objectForKey: * keyEnumerator *的setObject:forKey: * removeObjectForKey: 我猶豫使用類別,因爲據我瞭解那會在我的應用程序中影響NSMutableDictionary的每一次使用? – Ben 2011-01-25 04:17:08

+0

另外,我不知道你在做什麼錯誤,但是當你試圖訪問一個在字典中找不到的鍵時,它會返回`nil`;它不會拋出「NSUndefinedKeyException」......你究竟在做什麼? – 2011-01-25 04:19:39

-1

您確定在傳遞「無」KEY(不是值)時沒有得到異常嗎?