0

プロジェクトで宣言された 2 つのプロトコルがあります。最初に書いた名前はSSSelectingCategory.h

#import <Foundation/Foundation.h>

@protocol SSSelectingCategory <NSObject>

@required
@property (nonatomic, strong) SSCategory *selectedCategory;

@end

二つ目はSSSelectingIcon.h

#import <Foundation/Foundation.h>

@protocol SSSelectingIcon <NSObject>

@required
@property (nonatomic, strong) SSIcon *selectedIcon;

@end

奇妙なことに、最初のプロトコルはエラーや警告なしでコンパイルされますが、2 番目のプロトコルはUnknown type name 'SSIcon'.

この問題に対する答えは、次のように 2 番目のプロトコルで forward-class 宣言を使用することだとわかっています。

#import <Foundation/Foundation.h>
@class SSIcon;

@protocol SSSelectingIcon <NSObject>

@required
@property (nonatomic, strong) SSIcon *selectedIcon;

@end

しかし、今では、明示的またはフォワードクラスの宣言を一切SSSelectingCategory.h行っていないため、そもそもプロトコルをコンパイルするべきではなかったと思います。#import

コンパイラを静かにしてコーディングを続けることもできますが、どちらのプロトコルも非常に単純であるため、Xcode で何か奇妙なことが起こっているのか、それとも細かい点が欠けているのかを理解したいと思います。SSCategoryand/orSSIconクラスは両方ともNSManagedObjects であり、2 つを接続する関係があるため、これらのクラスに問題がある可能性はありますか?

4

1 に答える 1

1

コンパイラは .m ファイルをコンパイルし、これに .h ファイルが含まれます。

したがって、「SSSelectingCategory.h」が含まれる.mファイルではSSCategory、コンパイラがプロトコルをコンパイルする際に問題がないように、以前に定義されていると仮定します。

一方、「SSSelectingIcon.h」が定義されていない状態でインクルードされている場合SSIcon、コンパイラはそこでエラーを出して中断します。

いずれにせよ、必要なインターフェイスを .h ファイルに含める (または必要なクラスを前方宣言する) ことは理にかなっています。これにより、Xcode でコード補完が可能になるからです。

于 2012-09-08T21:07:08.783 に答える