20

のキーとしてクラスを使用しようとしていますNSDictionary私はこの質問に対する答えを見ましたが、私が持っているものはほとんど同じです。を使用してsetObject: forKey:います。しかし、XCodeは文句を言って、Incompatible pointer types sending 'Class' to parameter of type 'id<NSCopying>'. 私が持っている呼び出しは次のとおりです。

[_bugTypeToSerializerDictionary setObject: bugToStringSerializer 
                                forKey: [bugToStringSerializer serializedObjectType]];

bugToStringSerializerBugToStringSerializerは、具体的な実装が実装する のインスタンスですserializedObjectType。具体的な実装例は次のようになります。

- (Class) serializedObjectType {
    return [InfectableBug class];
}

ここで何が間違っていますか?

4

4 に答える 4

36

(クラスは に準拠しているようですNSCopyingが、型は ではありませんid <NSCopying>。)編集:クラスはプロトコルに準拠していません。もちろん、重要なことは、クラスがcopyおよびcopyWithZone:メッセージに応答することです (そのため、この場合、警告を安全に無視できます)。それらの型はまだではありませんid <NSCopying>。) それが、コンパイラが文句を言う理由です。

その醜い警告が本当に必要ない場合は、明示的な型変換を実行してください。

[dictionary setObject:object forKey:(id <NSCopying>)someClass];
于 2012-09-21T06:43:57.543 に答える
19

あはは、プロジェクトのバグを修正しました。

これを使って:

NSStringFromClass([Someclass class]);
于 2012-09-21T06:38:30.527 に答える
4

他の回答は確かに役に立ちますが、この場合は、 NSDictionary とは異なりキーをコピーせず、強力なポインターで保持するだけのNSMapTableを使用する方がおそらく理にかなっています (デフォルトでは、これは変更できます)。

その後、元のコードを変更せずにそのまま使用できます。

NSMapTable *_bugTypeToSerializerDictionary = [NSMapTable new];
...
[_bugTypeToSerializerDictionary setObject: bugToStringSerializer
                                   forKey: [bugToStringSerializer serializedObjectType]];

ハックが少なく、プログラマーの意図をより明確に伝えることができます。

追加のスタイル ポイントについては、インスタンス変数に のようなもう少し適切な名前を付けることができます_bugTypeToSerializerMap

于 2014-06-01T12:09:44.843 に答える
0

これは私の通常のコードです:

@{
    (id)[MyClass1 class] : @1,
    (id)[MyClass2 class] : @2,
    (id)[MyClass3 class] : @3,
    (id)[MyClass4 class] : @4,
};

しかし最近、私はこのアプローチを発見しました:

@{
    MyClass1.self : @1,
    MyClass2.self : @2,
    MyClass3.self : @3,
    MyClass4.self : @4,
};
于 2017-03-21T10:44:37.520 に答える