型が内部であり、同じモジュール内に存在しているにもかかわらず、Swiftでの "宣言されていない型の使用"
私のモジュールには型があります。
import Cocoa
class ColoredDotView : NSView {
...
}
これは問題なくいくつかの異なるクラスで使用されています。
class EditSubjectPopoverController : NSObject {
@IBOutlet internal var subjectColorDotView : ColoredDotView!
...
}
しかし、なんらかの理由で、1つの特定のクラスで使用すると、私はタイプのコンパイルエラーがあります:
class EditTaskPopoverController : NSObject {
@IBOutlet internal var lowPriorityDotView : ColoredDotView! // Error here
@IBOutlet internal var medPriorityDotView : ColoredDotView! // And here...
@IBOutlet internal var highPriorityDotView : ColoredDotView! // And here...
...
}
コンパイルエラーは次のとおりです。
EditTaskPopoverController.Swift:15:49:宣言されていない型 'ColoredDotView'の使用
わかりません。これはファイル内の最初のコンパイルエラーであり、残りのエラーはすべて最初のものの症状です。さらに、他にコンパイルエラーのあるファイルはありません。ファイルが同じモジュール内にあるため、型が宣言されていない理由がわかりません。
プロジェクトの整理、ビルドフォルダの整理、およびXcodeの再起動を試してみましたが、役に立ちませんでした。 Swiftでundeclared type
コンパイラエラーが発生する可能性があるのは、どのようなミスがありますか?
ふう、やっとこれを診断した。 どういうわけか、問題のあるSwiftファイルEditTaskPopoverController.Swift
は2つの異なるビルドフェーズにありました。
他のすべてのSwiftファイルと一緒に正しくCompile Sources
に入っていましたが、奇妙な理由から、Copy Bundle Resources
フェーズでもまたでした。私のすべてのXIBと画像リソースで。
それがどのようにして得られたのかわかりませんが、追加のビルドフェーズから削除することで問題は解決しました。
私の場合、私のテストターゲットが私のアプリビルドターゲットがコンパイルソースに持っていたいくつかのSwiftファイルを持っていなかったとき私はこのエラーに遭遇しました。 「宣言されていない型」が他の多くの場所で問題なく使用されていたため、非常に紛らわしく、エラーはあいまいに思えました。そのため、解決策として、テスト対象に「宣言されていない型」を含むファイルを追加することができました。
これは@Craig Otisによってすでに回答されていますが、問題となっているクラスが同じターゲットに属していない場合、通常はテストターゲットが見つからない場合に問題が発生します。以下のチェックボックスがチェックされていることを確認してください。
編集する
対象会員を確認する。ファイルを選択してファイルインスペクタを開く(⌥+⌘+ 1)[オプション] + [コマンド] +1
XCodeメニューでProduct-> Clean、そしてProduct-> Buildの順に選択してください。新しいViewControllerを新しいグループ/フォルダのプロジェクトに追加したときにこの問題が発生しました。
私にとっての原因は、型と同じ文字で始まる関数名でした。
@IBOutlet weak var tableView: CustomTableView!
そして実装で私はCustomTableViewで始まる関数を持っていました
func CustomTableView(tableView: CustomTableView, dataForRow row: Int) -> NSData {...}
修正は、関数のシグネチャが型(CustomTableView)と同じ文字で始まらないように変更することでした。
func dataForRow(row: Int, tableView: CustomTableView) -> NSData {...}
これは私の場合の実際の原因に対する非常に誤解を招くようなエラーメッセージでした。
私はまったく同じ問題を抱えていました。私のフレームワーク内のファイルのいくつかは同じモジュール内の他のクラスから到達できませんでした。
何らかの理由で、Xcodeのフレームワークに追加されたファイルはコンパイルソースの一部ではありませんでした。 Swiftファイルがコンパイルソースの一部ではない場合は、+をタップしてポップアップでそれらを選択して追加する必要があります。
ファイルがフレームワークターゲットの一部であることも確認してください。 (下のスクリーンショットの小さなボックスをチェックしてください)
私のアプリには、パブリックとしてテストによってアクセスされる必要があるアプリデリゲートと他のクラスがあります。 ここで概説したように 、次に自分のアプリをテストにインポートします。
私が最近2つの新しいクラスを作成したとき、それらのテストターゲットは主要部分とテスト部分の両方でした。テストからメンバーを除外することで問題は解決しました。
誰かが似たような問題に遭遇したが、 コンパイルソース修正 が問題を解決しない場合、Xcodeを再起動すると(私にとってはうまくいきました)。私のXcodeのバージョンはVersion 6.1 (6A1052d)
です。
これは、誤ってパラメータ名を大文字にし、それをオブジェクトと同じ名前にした場合にも発生する可能性があります。
class func didRecieveData(BlockItems: [BlockItems])
これは、シグネチャのオブジェクトタイプと同じ名前の関数がある場合にも発生する可能性があります。例えば:
class func Player(playerObj: Player)
コンパイラは最初にファイル内でローカルに検索してから他のファイルを検索するため、コンパイラは混乱します(そして当然のことながら)。そのため、シグネチャの中の "Player"を見て、それがこのスコープ内のオブジェクトではなく関数であると考えるので、何か問題があります。
おそらくこれが、クラス関数を大文字にするべきでない理由です。 :)
私はここで提供されている解決策の多くを試してみました、しかし結局ファイルを削除して、そして再びそれを作成しました、そして、Xcodeは崇拝されました:/
これは誰かに役立つかもしれません。
私は "CoreData"と呼ばれるコアデータで新しいテストプロジェクトを作成しました。まもなく、NSManagedObjectContextおよびその他のコアデータクラスに「宣言されていない型を使用する」ことができます。プロジェクトを削除して "TestingCoreData"という名前の新しいプロジェクトを開始したところ、すべてうまくいきました。
プロジェクトの名前をクラスの名前のようにしない( - テストする)
フレームワークにコードをリファクタリングしている間、私はXcode 8でこのエラーメッセージを受け取りました、それは私がpublic
としてフレームワークのクラスを宣言するのを忘れていたことが出てきます
私の場合、これはサブクラス名が次の行で異なる型の変数名として使用されていることが原因でした。
var binGlow: pipGlow = pipGlow(style: "Bin")
var pipGlow: PipGlowSprite = PipGlowSprite()
1行目で、pipGlowは(SKShapeNodeの)サブクラスの名前ですが、2行目では、変数名としてpipGlowを使用していました。これは悪いコーディングスタイルだけでなく、明らかに完全にノーでもありました! 2行目を次のように変更したら、
var binGlow: pipGlow = pipGlow(style: "Bin")
var pipGlowSprite: PipGlowSprite = PipGlowSprite()
私はもうエラーを受け取らなかった。これが誰かに役立つことを願っています!
アプリケーションに属するSwiftコードをテストするときは、まずテストターゲットが依存関係としてアプリケーションを構築していることを確認してください。次に、テストでアプリケーションをモジュールとしてインポートします。例えば:
@testable import MyApplication
これにより、アプリケーションの一部であるSwiftオブジェクトがテストに使用できるようになります。
私の場合は私のミスです。 "iOS> Source> Cocoa Touch Class"ではなく、 "OS X> Source> Cocoa Class"として新しいファイルを追加しました。
プロジェクトを掃除することで私の問題は解決しました。
ステップ:製品 - >クリーン(またはShift + Cmd + K)
正しいインポート宣言を追加しないと、明らかに失敗することもあります。私にとっては、Priority UIKitのインポートを省略しただけです。
@testable
を誤動作させているのは、他の人と同様に、無関係のコードでした。
私のテストターゲットにはObjective-Cヘッダファイルがありました。
@import ModuleUnderTest;
この行を削除し(インポートは実際には不要だったため)、奇跡的に@testable
が再び機能し始めました。
これを追跡することしかできませんでしたが、プロジェクトからすべてを削除し、失敗するまで少しずつ追加し直しました。結局、問題のあるコード行を見つけました。
エラーは非常にばかげていることがあります
ここまでのすべてのソリューションを確認する前に、すべての基本的なものをインポートしたことを確認してください
import Foundation
import UIKit
外部からプロジェクトにいくつかのファイルをインポートすると、一度経験したようなこの基本的なことを見逃す可能性があります。
私の場合は、カスタムSwiftオブジェクトを持つメソッドを型パラメータとして追加したいと思いましたが、パラメータ内の変数に付けた名前は、カスタムオブジェクトクラス名とまったく同じです。
問題はこのようなものでした:
func moveBlob(**blob** : blob){
...code
}
太字文字の部分が宣言されていない型のエラーを引き起こしていました
あなたが別のmodule
またはTarget
からアクセスしているのなら、それをpublic
するために必要です。
たぶんあなたはいくつかの "FirstNameClass"を持つクラスを追加し、その後手動で "ColoredDotView"に名前を変更します。 "ColoredDotView"クラスの内容をクリップボードにコピーし、 "ColoredDotView"をプロジェクトから削除してaginを追加します。
このIDは私からの同様の問題を解決します。
私の状況は、新しいファイルXXView.Swiftをプロジェクトにドラッグすることです。そして、ViewタイプをXXViewとして宣言し、「use undeclared type ....」というエラーを宣言します。
XXView.Swiftをテストターゲットに追加して、エラーを解決しました。ただし、テスト対象にUIクラスを含めることは望ましくありません。
最後に、ViewControllerが既にテストターゲットにあることがわかりましたが、これは起こりません。 (VCをxctemplateで作成するため、テストターゲットに自動的に含まれると思います)
テストターゲットからView Controllerを削除すると、XXViewをテストターゲットに追加する必要がなくなりました。
結論:関連ファイルもすべてテスト対象のチェックを外す必要があります。
誰かが私がしたのと同じ愚かな間違いをする場合には...
ソースファイルの名前を変更する際に、誤って.
をファイル名から削除したため、コンパイラはそのファイルをプレーンテキストファイルとして扱い、コンパイルするためのソースとしては扱わないため、このエラーが発生しました。
そのため、ファイルの名前をMyProtocol.Swift
に変更しましたが、誤ってMyProtocolswift
と名付けました。
これは単純な間違いですが、これが起こっていることであることはすぐにはわかりませんでした。