0

これは初心者の質問です。次のようなオブジェクトがあります(例MyObject.h)。

#import <Foundation/Foundation.h>
#import "JSONModel.h"
@protocol MyObject
@end
@interface MyObject : JSONModel
@property (strong,nonatomic) NSString* name;
@end

そして、実装は次のようになります (eg MyObject.m)。

#import "MyObject.h"
@implementation MyObject
@end

他の場所のコードでは、次のように a を定義NSMutableArrayします。

NSMutableArray<MyObject>* list;
list = [[NSMutableArray alloc] init];

そして、私はこの警告を受け取ります。

「NSMutableArray 」から「 NSMutableArray<MyObject>」を割り当てる互換性のないポインター型

ジェネリクスはコレクション用のObjective-Cによってすぐにサポートされていないことを知っています(そして、それは私がここでやろうとしていることでもありません)が、従おうとしているので、私NSMutableArrayはそのようなプロトコルで定義されています「JSONModel の」GitHub ページの例MyObject

コードは引き続きコンパイルされますが、上記の警告が表示されます。どうすれば

  • 警告を消す、または
  • NSMutableArray正しく割り当て/初期化しますか?

アップデート:

その警告を取り除く方法を引き続き検索しましたNSMutableArrayが、次のようなものを作成すると、警告が消えます (プロジェクトはエラーなしでコンパイルされます)。単体テストを作成し、期待どおりに動作するかどうかを確認します。

list = (id)[NSMutableArray new];
4

1 に答える 1

5
NSMutableArray<MyObject>*

これは、あなたがこれが意味すると考えていることを意味するものではありません。これは「NSMutableArrayに準拠するもの」ではありません<MyObject>。これは「NSMutableArrayそれ自体が に準拠するのサブクラス」<MyObject>です。

あなたが提供したリンクが何を達成しようとしているのかわかりません。をサブクラス化したか、プロトコルに準拠しようとするカテゴリでNSArray装飾した可能性があります。NSArrayどちらの場合でも、それは少し危険と非常識の間です。私は彼らが考えていたことについて彼らに話しました。何か意味があるように見えて、実際には何の意味もない装飾として彼らがこれを行っているのではないかと私は疑っています。(これは前例のないことではありません。Apple は でそれを行っています。CFPropertyListRefこれは何かを意味するように見えますが、実際const void*には です。警告が決して来ないことを期待すると、これは非常に驚くべきことです。)

警告を取り除く方法の問題に対しては、間違ったプロトコルの装飾を取り除くだけです。NSMutableArray*ではないはずNSMutableArray<something>*です。

ところで、このコードはゼロから無視できるほどの利益をもたらします:

NSMutableArray<MyObject>* list = (id)[NSMutableArray new];

後で を呼び出すとlist = someOtherKindOfList警告が表示されるという小さな利点がありますが、これは信じられないほど珍しい操作です (とにかく 90% の確率でキャストする必要があるため、警告が実際のエラーをキャッチすることはほとんどありません)。[list addObject:someRandomType]ただし、最も注目すべきは、ここで間違いを犯す最も一般的な方法である場合に、警告をスローしないことです。だからといって、飾る意味はありません。

于 2014-05-13T18:40:01.327 に答える