web-dev-qa-db-ja.com

型が内部であり、同じモジュール内に存在しているにもかかわらず、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'の使用

わかりません。これはファイル内の最初のコンパイルエラーであり、残りのエラーはすべて最初のものの症状です。さらに、他にコンパイルエラーのあるファイルはありません。ファイルが同じモジュール内にあるため、型が宣言されていない理由がわかりません。

enter image description here

プロジェクトの整理、ビルドフォルダの整理、およびXcodeの再起動を試してみましたが、役に立ちませんでした。 Swiftでundeclared typeコンパイラエラーが発生する可能性があるのは、どのようなミスがありますか?

147
Craig Otis

ふう、やっとこれを診断した。 どういうわけか、問題のあるSwiftファイルEditTaskPopoverController.Swiftは2つの異なるビルドフェーズにありました。

他のすべてのSwiftファイルと一緒に正しくCompile Sourcesに入っていましたが、奇妙な理由から、Copy Bundle Resourcesフェーズでもまたでした。私のすべてのXIBと画像リソースで。

それがどのようにして得られたのかわかりませんが、追加のビルドフェーズから削除することで問題は解決しました。

32
Craig Otis

私の場合、私のテストターゲットが私のアプリビルドターゲットがコンパイルソースに持っていたいくつかのSwiftファイルを持っていなかったとき私はこのエラーに遭遇しました。 「宣言されていない型」が他の多くの場所で問題なく使用されていたため、非常に紛らわしく、エラーはあいまいに思えました。そのため、解決策として、テスト対象に「宣言されていない型」を含むファイルを追加することができました。

178
mattorb

これは@Craig Otisによってすでに回答されていますが、問題となっているクラスが同じターゲットに属していない場合、通常はテストターゲットが見つからない場合に問題が発生します。以下のチェックボックスがチェックされていることを確認してください。


target membership

編集する

対象会員を確認する。ファイルを選択してファイルインスペクタを開く(⌥+⌘+ 1)[オプション] + [コマンド] +1

detailed description

158
Edwin

XCodeメニューでProduct-> Clean、そしてProduct-> Buildの順に選択してください。新しいViewControllerを新しいグループ/フォルダのプロジェクトに追加したときにこの問題が発生しました。

16
Array

私にとっての原因は、型と同じ文字で始まる関数名でした。

@IBOutlet weak var tableView: CustomTableView!

そして実装で私はCustomTableViewで始まる関数を持っていました

func CustomTableView(tableView: CustomTableView, dataForRow row:  Int) -> NSData {...}

修正は、関​​数のシグネチャが型(CustomTableView)と同じ文字で始まらないように変更することでした。

func dataForRow(row: Int, tableView: CustomTableView) -> NSData {...}

これは私の場合の実際の原因に対する非常に誤解を招くようなエラーメッセージでした。

11
Andrew

私はまったく同じ問題を抱えていました。私のフレームワーク内のファイルのいくつかは同じモジュール内の他のクラスから到達できませんでした。

何らかの理由で、Xcodeのフレームワークに追加されたファイルはコンパイルソースの一部ではありませんでした。 Swiftファイルがコンパイルソースの一部ではない場合は、+をタップしてポップアップでそれらを選択して追加する必要があります。

Screenshot 1

ファイルがフレームワークターゲットの一部であることも確認してください。 (下のスクリーンショットの小さなボックスをチェックしてください)

Screenshot 2

11
Groot

私のアプリには、パブリックとしてテストによってアクセスされる必要があるアプリデリゲートと他のクラスがあります。 ここで概説したように 、次に自分のアプリをテストにインポートします。

私が最近2つの新しいクラスを作成したとき、それらのテストターゲットは主要部分とテスト部分の両方でした。テストからメンバーを除外することで問題は解決しました。

4
Nate Uni

誰かが似たような問題に遭遇したが、 コンパイルソース修正 が問題を解決しない場合、Xcodeを再起動すると(私にとってはうまくいきました)。私のXcodeのバージョンはVersion 6.1 (6A1052d)です。

3
lindon fox

これは、誤ってパラメータ名を大文字にし、それをオブジェクトと同じ名前にした場合にも発生する可能性があります。

class func didRecieveData(BlockItems: [BlockItems])
3
Rindom

これは、シグネチャのオブジェクトタイプと同じ名前の関数がある場合にも発生する可能性があります。例えば:

class func Player(playerObj: Player)

コンパイラは最初にファイル内でローカルに検索してから他のファイルを検索するため、コンパイラは混乱します(そして当然のことながら)。そのため、シグネチャの中の "Player"を見て、それがこのスコープ内のオブジェクトではなく関数であると考えるので、何か問題があります。

おそらくこれが、クラス関数を大文字にするべきでない理由です。 :)

2
Maxwell

私はここで提供されている解決策の多くを試してみました、しかし結局ファイルを削除して、そして再びそれを作成しました、そして、Xcodeは崇拝されました:/

2
Yusuf X

これは誰かに役立つかもしれません。

私は "CoreData"と呼ばれるコアデータで新しいテストプロジェクトを作成しました。まもなく、NSManagedObjectContextおよびその他のコアデータクラスに「宣言されていない型を使用する」ことができます。プロジェクトを削除して "TestingCoreData"という名前の新しいプロジェクトを開始したところ、すべてうまくいきました。

プロジェクトの名前をクラスの名前のようにしない( - テストする)

2
Babac

フレームワークにコードをリファクタリングしている間、私はXcode 8でこのエラーメッセージを受け取りました、それは私がpublicとしてフレームワークのクラスを宣言するのを忘れていたことが出てきます

2
tsuchi.one

私の場合、これはサブクラス名が次の行で異なる型の変数名として使用されていることが原因でした。

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()

私はもうエラーを受け取らなかった。これが誰かに役立つことを願っています!

1
zeeple

アプリケーションに属するSwiftコードをテストするときは、まずテストターゲットが依存関係としてアプリケーションを構築していることを確認してください。次に、テストでアプリケーションをモジュールとしてインポートします。例えば:

@testable import MyApplication

これにより、アプリケーションの一部であるSwiftオブジェクトがテストに使用できるようになります。

1
quellish

私の場合、TestTargetのコンパイルソースはMain Targetのファイルを持っていました。

Ref

Test Target contains files from main target in compile sources tab

なぜこれが起こるのですか?

  • これは、ファイルの作成中にTestTargetアソシエーションを確認したために起こります。

  • またはインスペクタからこのオプションを手動で確認してください。

    Ref

    Create File - Test Target is Checked

どうやって解決しましたか?

  • Test Targetのコンパイルソースからメインターゲットのファイルを削除しました
1
Ratz

私の場合は私のミスです。 "iOS> Source> Cocoa Touch Class"ではなく、 "OS X> Source> Cocoa Class"として新しいファイルを追加しました。

プロジェクトを掃除することで私の問題は解決しました。

ステップ:製品 - >クリーン(またはShift + Cmd + K)

1
Anshul Tiwari

正しいインポート宣言を追加しないと、明らかに失敗することもあります。私にとっては、Priority UIKitのインポートを省略しただけです。

0
Mississippi

@testableを誤動作させているのは、他の人と同様に、無関係のコードでした。

私のテストターゲットにはObjective-Cヘッダファイルがありました。

@import ModuleUnderTest;

この行を削除し(インポートは実際には不要だったため)、奇跡的に@testableが再び機能し始めました。

これを追跡することしかできませんでしたが、プロジェクトからすべてを削除し、失敗するまで少しずつ追加し直しました。結局、問題のあるコード行を見つけました。

0
Oliver Pearmain

エラーは非常にばかげていることがあります

ここまでのすべてのソリューションを確認する前に、すべての基本的なものをインポートしたことを確認してください

     import Foundation
     import UIKit

外部からプロジェクトにいくつかのファイルをインポートすると、一度経験したようなこの基本的なことを見逃す可能性があります。

0
Suraj K Thomas

私の場合、それはSwiftファイルのテキストエンコーディングが原因でした。 1つのファイルが 'No Explicit Encoding'を示し、それを 'UTF-8'に変換した後、問題は解決しました。

そして、ファイルのテキストエンコーディングが明示的ではないのは、他のSwiftファイルからすべてのコードをコピーしたからです。

明示的なエンコードなし

enter image description here

UTF-8スクリーンショット

enter image description here

0
Jirui

私の場合は、カスタムSwiftオブジェクトを持つメソッドを型パラメータとして追加したいと思いましたが、パラメータ内の変数に付けた名前は、カスタムオブジェクトクラス名とまったく同じです。

問題はこのようなものでした:

func moveBlob(**blob** : blob){
    ...code
}

太字文字の部分が宣言されていない型のエラーを引き起こしていました

0
cmario

あなたが別のmoduleまたはTargetからアクセスしているのなら、それをpublicするために必要です。

0
Sultan Ali

たぶんあなたはいくつかの "FirstNameClass"を持つクラスを追加し、その後手動で "ColoredDotView"に名前を変更します。 "ColoredDotView"クラスの内容をクリップボードにコピーし、 "ColoredDotView"をプロジェクトから削除してaginを追加します。

このIDは私からの同様の問題を解決します。

0
Almin

他の人がよく言ったように、このスレッドで

「バンドルリソースのコピー」での不要なSwiftファイルの使用 screen shot for helping

0
nova

私の状況は、新しいファイルXXView.Swiftをプロジェクトにドラッグすることです。そして、ViewタイプをXXViewとして宣言し、「use undeclared type ....」というエラーを宣言します。

XXView.Swiftをテストターゲットに追加して、エラーを解決しました。ただし、テスト対象にUIクラスを含めることは望ましくありません。

最後に、ViewControllerが既にテストターゲットにあることがわかりましたが、これは起こりません。 (VCをxctemplateで作成するため、テストターゲットに自動的に含まれると思います)

テストターゲットからView Controllerを削除すると、XXViewをテストターゲットに追加する必要がなくなりました。

結論:関連ファイルもすべてテスト対象のチェックを外す必要があります。

0
Wangdu Lin

誰かが私がしたのと同じ愚かな間違いをする場合には...

ソースファイルの名前を変更する際に、誤って.をファイル名から削除したため、コンパイラはそのファイルをプレーンテキストファイルとして扱い、コンパイルするためのソースとしては扱わないため、このエラーが発生しました。

そのため、ファイルの名前をMyProtocol.Swiftに変更しましたが、誤ってMyProtocolswiftと名付けました。

これは単純な間違いですが、これが起こっていることであることはすぐにはわかりませんでした。

0
Marc Renaud