6

軽量ジェネリックでスタック クラスを実装しようとしています。しかし、Xcode が の定義を見つけられないため、コードはコンパイルに失敗しました。ObjectType

@implementation Stack
- (ObjectType)popObject     !!!!!!!!!Expected a type
{
    return self.allObjects.firstObject;
}
@end

ヘッダー宣言はエラーを生成しないため、奇妙です。

@interface Stack<__covariant ObjectType> : NSObject
- (ObjectType)popObject;
@property (nonatomic, readonly) NSArray<ObjectType> *allObjects;
@end

ObjectTypeに変更することで機能させることができましたid。エラーを修正するより良い方法はありますか?

4

2 に答える 2

17

Objective-C ジェネリックは本当に軽量であり、Objective-C コードをより安全にするためではなく、Swift との相互運用性を向上させるために追加されました。null 可能性と同様に、ジェネリックは、実装を変更する理由ではなく、インターフェイスに注釈を付ける方法と考えてください。

実装で に変更ObjectTypeすることが最善の方法です。id

さらに読む: Objective C Generics に関する記事。について知りたい場合は、その記事に対するボブのコメントを読んでください__covariant

于 2015-07-02T11:54:45.297 に答える
1

あくまでも推測ですが、 で置き換えるObjectTypeid、ポインタ型ではないのではないでしょうか?

つまり、@interface ObjectTypeどこかにある場合は、中括弧とメソッドの戻り値の両方でStackある必要がありますObjectType*<...>

それが問題ではない場合、誤解を招くことをお詫びします

于 2015-06-18T08:14:12.260 に答える