Swiftでの「宣言されていない型の使用」は、型が内部であり、同じモジュールに存在する場合でも


173

モジュールにタイプがあります:

import Cocoa

class ColoredDotView : NSView {
   ...
}

問題なくいくつかのクラスで使用されています。

class EditSubjectPopoverController : NSObject {

    @IBOutlet internal var subjectColorDotView : ColoredDotView!
    ...
}

しかし、何らかの理由で特定のクラスで使用すると、型にコンパイルエラーが発生します。

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の再起動を試みましたが、役に立ちませんでした。undeclared typeSwiftでコンパイラエラーが発生する可能性がある潜在的なミスステップは何ですか?


実際のエラーが数行(またはそれ以上)先にあり、Xcodeが誤って無害なものにエラーメッセージのタグを付けている場合がよくあります。コードの残りの部分を消去してエラーを解消できるかどうかを確認し、少しずつ元に戻します...
Nate Cook

ありがとうネイト-残念ながら私はvar宣言を削除し、合格したビルドに取り掛かります。次に、上部に宣言の1つを追加すると、エラーはすぐに戻ります。imgur.com
Craig Otis

回答:


200

私の場合、テストターゲットに、アプリのビルドターゲットがコンパイルソースに持っていた迅速なファイルがなかったときに、このエラーが発生しました。他の多くの場所で「宣言されていない型」が問題なく使用されており、エラーが曖昧に見えるため、非常に混乱しました。したがって、当然のことながら、「宣言されていない型」を含むファイルをテストターゲットに追加するソリューションがありました。


2
私も同じです。問題は、テストターゲットに含まれている別のクラスが使用しているクラスが、テストターゲットにも含まれていない場合に発生します。(╯°□°)╯(┻━┻
フランチェスコVadicamo

2
あなたはちょうど30分私を苛立たせた問題を解決しました。以前のSwiftクラスを現在のプロジェクトにインポートしましたが、明らかに古いクラスをまだテストターゲットに追加していません。しかし、オートコンプリートによって、すべてが問題ないと思ってしまいました。ビルドして実行しようとするまでは。なんだ…!どうもありがとうございました。
ジムヒルハウス、2015

2
これは私にとっても問題を解決しました。ファイルをクリックして、ファイル->ファイルのコピーを複製しました。新しいコピーがリストされましたが、「コンパイルソース」に含まれていませんでした
Ron Myschuk

1
私の場合、3つのターゲット(プロジェクト、UI、および単体テスト)を選択しましたが、このエラーを解決するために、UIおよび単体テストのターゲットの選択を解除する必要がありました
Frakcool

1
「もちろんソリューション...」は、読者がテストターゲットを追加する方法を理解していることを前提としています。Xcodeを使い始めたばかりの私たちにとって、それは「もちろん...」の瞬間ではありません。彼があなたの答えを終えたとき、私は@edwinの答えに賛成しました。
マイケル

181

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


対象会員

編集する

ターゲットメンバーシップを表示します。ファイルを選択し、ファイルインスペクタを開きます(⌥+⌘+ 1)[ オプション ] + [ コマンド ] + 1

詳細な説明


わかりませんが、「テスト」ターゲット(この場合はYAWA-WeatherTest)をオフにすると、エラーなしでビルドされました。
dellos、2015年

このターゲットメンバーシップを設定するXCodeの場所を明確にできますか?今まで見た覚えはありません。ありがとう。
Casey Perkins

2
実際、テストプロジェクトでは「@testable import ...」を使用するので、テストターゲットのチェックを外します。
..

スクリーンショットは非常に役立ちます。ありがとう!
マイケル

37

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

それはしていたCompile Sources他のすべてのスウィフトのファイルを、適切に、それはだったで、いくつかの非常に奇妙な理由で、Copy Bundle Resourcesすべての私のXIBと画像リソースとともに、同様の相。

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


私が使っていたので、それは、判明同じ問題を抱えていたgithub.com/kronenthaler/mod-pbxproj私は偶然MOD-pbxprojに代わりPBXSourcesBuildPhaseのPBXResourcesBuildPhaseなどの型に迅速に追加した、かつ迅速に
リッチー

2
メイト!ライフセーバーは、これに頭を悩ませていました。乾杯
SparkyRobinson

27

XCodeメニューで、製品->クリーン、次に製品->ビルドが機能しました。新しいGroup / Folderのプロジェクトに新しいViewControllerを追加すると、この問題が発生しました。


5
2時間、私はかつて私は...今去ることでしょう...ポッドをインストールした後でフレームワークを組み込むために、ビルドボタンをクリックするとは思わなかった
Cruceo

1
他の回答を試すことで多くの時間を無駄にしましたが、掃除して構築することはありませんでした。
どうも

Xcode 11.0ベータ5でSwiftUIを使ってプレイしているときに、Appleチュートリアルに従っていたときに、このエラーが発生しました。キャンバスは他のファイルを正しく表示していましたが、新しく追加されたファイルがこのエラーをスローし、LandmarkRow_Previewsは宣言されていないタイプでした。ビルドクリーンのみで問題が修正されました。
salo.dm

この回答は、Techサポートと同等です:「デバイスを再起動しようとしましたか?」良いヒント:)
チューリングテスト済み

14

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

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

スクリーンショット1

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

スクリーンショット2


12

私の原因は、タイプと同じ文字で始まる関数名でした:

@IBOutlet weak var tableView: CustomTableView!

実装では、CustomTableViewで始まる関数がありました

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

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

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

これは、私の場合、実際の原因について非常に誤解を招くエラーメッセージでした。


1
この修正Andrewを投稿してくれてありがとう、それは大きな助けになりました。エラーメッセージは確かに誤解を招くものです。
jjc99 2016年

7

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


再起動はうまくいきましたが、ビルドが成功した後、コードを変更することなくエラーが再び表示されました。
珍しい2017年

Xcodeを再起動すると、多くの問題が修正され、Appleは実際に何かをすべきです。
Forge

5

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

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


5

私の場合、TestTargetのコンパイルソースには、メインターゲットからのファイルがありました

参照

テストターゲットには、コンパイルソースタブのメインターゲットのファイルが含まれています

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

  • これは、ファイルの作成中にTestTargetの関連付けを確認するために発生します。

  • または、インスペクタからこのオプションを手動でチェックします。

    参照

    ファイルの作成-テストターゲットがチェックされています

どのように解決しましたか?

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

5

時々エラーは非常にばかげている可能性があります

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

     import Foundation
     import UIKit

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


CLLocationManagerDelegateの場合は偶然に起こりました。私がしなければならなかったのは、他のファイルにCoreLocationをインポートすることだけでした。
derek

4

私はここで提供されているソリューションの多くを試しましたが、最終的にファイルを削除して再度作成しましたが、Xcodeは解体されました:/


これも私にとってはうまくいきました。参照を削除し、クリーンアップしてビルドしてから、ファイルを再度追加しました。
andnil 2016年

ありがとうございました!これはかなり奇妙です。ちょうど私のためにも働いた。古いコードを削除し、古いコードを新しいファイルにコピーしました。クリーンアップ/ビルドする必要すらありませんでした。
ティマン

4

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

class func didRecieveData(BlockItems: [BlockItems])

3

これは誰かを助けるかもしれません。

「CoreData」というCore Dataで新しいテストプロジェクトを作成しました。まもなく、NSManagedObjectContextと他のコアデータクラスに「未宣言の型の使用」ができました。インポート、ビルドフェーズへの追加などを何度か試みた後、プロジェクトを削除して「TestingCoreData」という新しいプロジェクトを開始しましたが、すべてうまくいきました。

クラスの名前のようなプロジェクトに名前を付けないでください(テスト)


3

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

class func Player(playerObj: Player)

コンパイラーは他のファイルを調べる前にまずファイル内をローカルで調べるので、コンパイラーは混乱します(そして当然のことながら混乱します)。したがって、シグネチャ内の「プレーヤー」を見て、それはこのスコープ内のオブジェクトではなく関数であると考えるので、何かが間違っています。

おそらくこれが、クラス関数を大文字にしない方がいい理由でしょう。:)


3

フレームワークにコードをリファクタリングしているときにXcode 8でこのエラーメッセージが表示されました。フレームワークでクラスを宣言するのを忘れたようです。 public


2

多分あなたはいくつかの「FirstNameClass」を持つクラスを追加し、その後手動で「ColoredDotView」に名前を変更しました。「ColoredDotView」クラスのコンテンツをクリップボードにコピーし、プロジェクトから「ColoredDotView」を削除して、ginを追加してください。

このIDは、私からの同様の問題を修正します。



2

私の場合、これは、次の行で別のタイプの変数名としてサブクラス名が使用されていることが原因です。

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

エラーはもう発生しません。これが誰かに役立つことを願っています!


2

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

@testable import MyApplication

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


2

私の場合、それは迅速なファイルのテキストエンコーディングが原因でした。1つのファイルで「明示的なエンコードなし」が示され、それを「UTF-8」に変換した後、問題は解決しました。

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

明示的なエンコードなしのスクリーンショット

ここに画像の説明を入力してください

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

ここに画像の説明を入力してください



1

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

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

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

太字の部分が宣言されていない型のエラーの原因でした



1

他のように、それは@testable誤動作を引き起こしていたいくつかの無関係なコードでした。

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

@import ModuleUnderTest;

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

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


1

別の場所からアクセスしている場合、moduleまたはTargetそれを必要とするpublic場合


1

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

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

ファイルの名前を変更するつもり MyProtocol.swift でしたが、誤って名前を付けました MyProtocolswift

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


1

正しい輸入品のデリカレーションを追加しないことも、明らかにミスになる可能性があります。私にとっては、PriorityUIKitのインポートを省略しただけです。


1

私の状況は、新しいファイルXXView.swiftをプロジェクトにドラッグすることです。そして、ビューのタイプをXXViewとして宣言すると、「宣言されていないタイプの使用...」というエラーが発生します。

エラーを解決したテストターゲットにXXView.swiftを追加しようとしています。しかし、UIクラスをテストターゲットに含めたくありませんでした。

最後に、私は自分のViewControllerがすでにテストターゲットにあることを発見しました。(私はxctemplateでVCを作成するため、自動的にテストターゲットに含まれると思います)

テストターゲットからビューコントローラーを削除すると、XXViewをテストターゲットに追加する必要がなくなります。

結論:すべての関連ファイルでもテストターゲットのチェックを外してください。


1

このエラーに1時間費やした後、モジュールファイルが重複していることがわかりました。余分なファイルを削除し、Shift + cmd + kでクリーンアップするとエラーは発生しなくなります。


これは愚かな質問かもしれませんが、それについてもっと説明できますか?これは重複したSwiftファイルや重複したグループなどでも発生しますか?それは機能しましたが、機能することを受け入れるだけでなく、機能する理由についてもっと知りたいです。ところで解決策をありがとう!
Cody Vollrath

1

私の場合、問題は新しいclassものが認識されないことでした。クラスを削除して再度追加することで問題を解決しましたが、今回Watch App Extensionは新しいクラスを作成するときにオプションを確認します。

ここに画像の説明を入力してください

アプリケーションにWatch App Extensionがあることに注意してください。


おかげで、私の場合もファイルを正しいに追加する必要がありましたTarget
コールトレイン
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.