12

キーがディクショナリに存在しない場合に NSUndefinedKeyException をスローする代わりに、nil を返す 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 のすべてのメソッドをサブクラスに再度実装する必要がありますか、それともサブクラス化する必要がある他のクラスがありますか?

明確化: 私の最初の問題は、ドキュメントを正しく読めないことにありました。

NSMutableDictionary をサブクラス化する必要がある場合は、正しい答えを確認してください。キーが存在しないときに nil を返す辞書が必要な場合は、 NSMutableDictionary が既にそれを行っています。

4

3 に答える 3

26

NSMutableDictionaryクラスリファレンスによると:

サブクラスでは、そのプリミティブメソッドの両方をオーバーライドする必要があります。

1. setObject:forKey:
2. removeObjectForKey:

NSDictionaryまた、クラスのプリミティブメソッドをオーバーライドする必要があります。


NSDictionaryクラスリファレンスによると:

サブクラスNSDictionary化する必要がある場合は、aで表されるものを考慮する必要があります。Class clusterしたがって、メソッドが概念的に基づいているいくつかのプリミティブメソッドがあります。

1.カウント
2.objectForKey:
3. keyEnumerator
4. initWithObjects:forKeys:count:

サブクラスでは、これらすべてのメソッドをオーバーライドする必要があります。

NSDictionary’s他のメソッドは、これらのプリミティブの1つ以上を呼び出すことによって動作します。非プリミティブメソッドは、一度に複数のエントリにアクセスする便利な方法を提供します。


サブクラスを完全に機能させるには、これら6つのメソッドすべてをオーバーライドする必要があるようです。NSMutableDictionary

于 2011-01-25T04:17:30.983 に答える
4

これがあなたの問題です。NSDictionary(およびその可変の対応物)はクラスクラスターの一部であり( 「クラスクラスター」の見出しの下にある、ここでそれらの詳細を読んでください)、あなたが言及したような問題を引き起こすため、サブクラス化しないでください(サブクラス化の注意を読んでくださいNSDictionaryクラスリファレンス)。あなたがしなければならないことが何であれ、あなたはあなたがしたいことをするためにあなたが使いたいクラスを拡張する方法を持っているでしょう。たとえば、上記のコードは簡単にカテゴリに配置できます(カテゴリの詳細については、こちらをご覧ください)。

于 2011-01-25T04:13:48.187 に答える
-1

KEY(値ではない)に「nil」を渡したときに例外が発生していませんか?

于 2011-01-25T04:53:43.180 に答える