21

AppDelegate のさまざまなクラスに共通する多くのメソッドと定義を使用して、iOS プロジェクトを支援しています。したがって、これらの各クラスの .h ファイルで、#import "AppDelegate.h" を使用します。AppDelegate をインポートする別のクラスに AppDelegate を既にインポートしているクラスの 1 つにアクセスする必要があるまで、これは問題なく機能します。この時点で、AppDelegate の Duplicate Interface Definition エラーが発生します。

わかりました、それは公平に思えます。インポートするファイルに既に AppDelegate をインポートしているため、AppDelegate は 2 つの異なる場所からインポートされています。AppDelegate 行を削除すると、すべて問題ありません。

しかし、AppDelegate をインポートする必要がある 2 つのクラスをインポートする必要がある場合はどうなるでしょうか。

頭を包み込もうとしている非常に具体的な問題があり、これに関係する何かが原因であることはわかっていますが、何が原因かわかりません。したがって、この種のインポートをどのように処理する必要があるかを理解し、他のすべてを整理して、これが私の問題を解決することを願っています。したがって、これをより具体的に言えば、次のようになります。

ClassA.h、ClassB.h、および ClassC.h があります。すべて #import "AppDelegate.h" があります。ClassA で #import "ClassB.h" を使用する必要がある場合は、ClassA から #import "AppDelegate.h" 行を削除します。すべてがスムーズに機能します。しかし、"ClassC.h" を ClassA に #import する必要があり、ClassB と ClassC に "AppDelegate.h" をインポートする必要がある場合はどうなりますか?

編集:

上記で説明した正確なシナリオをクリーンなプロジェクトで試してみたところ、問題なくビルドされたので、別の何かが働いています。しかし、私が確実に言えることは、この問題がこのプロジェクトで以前に発生したとき、それは AppDelegate の重複したインターフェイス定義であり、 #import "AppDelegate.h" 行を削除すると、エラーはなくなりました。他のインポートされたファイルを介して AppDelegate.h メソッドと列挙型にアクセスできました。

4

6 に答える 6

29

これに対する最善の予防策と治療法は、ヘッダー ファイルからいつインポートするかについてのガイドラインに従うことです。原則として、次の場合を除き、Objective-C ヘッダーからインポートしないでください。

  1. 別のヘッダーで宣言されたクラスを拡張する必要があります。
  2. 別のヘッダーで宣言されているプロトコルへの準拠を宣言する必要があります。
  3. パブリック メソッドおよび/またはプロパティの別のヘッダーで定義された非クラス、非プロトコル型を参照する必要があります。プロトコルとクラスを参照するには、@classor@protocolを使用して前方宣言します。@class ClassFromOtherHeader;

他のすべて#importが実装に含まれる必要があります。#importこれらのルールに従って、すべてのステートメントをヘッダーから実装ファイルに移動することをお勧めします。問題の根本にあると思われるファイルから始めて、外側に移動します。これにより、問題が解決され、コードがより明確になり、ビルド時間が短縮されるという副次的な利点が得られます。

于 2012-09-13T23:00:01.403 に答える
21

私にとって、上記の答えはどれも役に立ちませんでしたし、ここで与えられた答えもうまくいきませんでした。

私にとってそれを修正したのは、Xcode を閉じて ~/Library/Developer/Xcode/DerivedData に移動し、このプロジェクトに関連付けられているすべての派生データを削除することでした。その後、プロジェクトを再開しましたが、問題なく動作していました。

それが誰かを助けることを願っています!

于 2014-04-28T18:18:51.493 に答える
3

私の場合、言及された解決策のどれも問題を解決しませんでした。Xcode は、Swift で書き直したクラスの重複したインターフェイスを報告していました。どういうわけか、プロジェクトで直接参照されていないクラスの Objective-C ヘッダー ファイルを取り込み続けました。

ターミナルを開いてcdプロジェクト ディレクトリに移動し、次のコマンドを実行して、クラス ヘッダーを含むすべてのファイルを追跡しました。 grep -nr ProblemClassName.h .

ブリッジング ヘッダーには、プロジェクト ナビゲーターでも参照されていない古いファイルが含まれていることが判明しました。これは、Xcode エラーで参照されているヘッダー ファイルをインポートしていましたが、これも Xcode プロジェクト ナビゲーターには含まれていませんでした。これで、エラーによって参照されるファイルを Xcode プロジェクト ナビゲーターだけに頼らないことがわかりました。

tl;drブリッジング ヘッダーを再確認して、そこにインポートされたすべてのファイルが存在し、問題のあるヘッダーをインポートしているヘッダーをインポートしていないことを確認します。

于 2015-11-09T20:17:58.330 に答える
0

Fwiw私はこれをランダムに取得し始めました-私にとっては修正が必要Product->Cleanで、魔法のように消えました。

于 2013-05-22T02:40:50.997 に答える
0

私にとっては、m ファイルのインターフェイス定義に括弧を含めるのを忘れていました。

于 2017-11-13T09:41:44.907 に答える