“Penggunaan tipe yang tidak dideklarasikan” di Swift, meskipun jenisnya internal, dan ada dalam modul yang sama

173

Saya memiliki tipe dalam modul saya:

import Cocoa

class ColoredDotView : NSView {
   ...
}

Ini digunakan di sejumlah kelas yang berbeda tanpa masalah:

class EditSubjectPopoverController : NSObject {

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

Tetapi untuk beberapa alasan , ketika saya menggunakannya dalam satu kelas tertentu , saya memiliki kesalahan kompilasi pada tipe:

class EditTaskPopoverController : NSObject {

    @IBOutlet internal var lowPriorityDotView : ColoredDotView! // Error here
    @IBOutlet internal var medPriorityDotView : ColoredDotView! // And here...
    @IBOutlet internal var highPriorityDotView : ColoredDotView! // And here...
    ...
}

Kesalahan kompilasi adalah:

EditTaskPopoverController.swift: 15: 49: Penggunaan tipe yang tidak dideklarasikan 'ColoredDotView'

Yang saya tidak mengerti. Ini kesalahan kompilasi pertama dalam file, dan kesalahan lainnya semuanya merupakan gejala dari yang pertama. Lebih lanjut, tidak ada file lain dengan kesalahan kompilasi. Saya tidak mengerti mengapa tipe ini tidak dideklarasikan, karena file tersebut ada di modul yang sama:

masukkan deskripsi gambar di sini

Saya telah mencoba membersihkan proyek, membersihkan folder build, dan memulai ulang Xcode, tetapi tidak berhasil. Apa kesalahan langkah potensial yang dapat menyebabkan undeclared typekesalahan kompiler di Swift?

Craig Otis
sumber
Saya punya banyak kasus di mana kesalahan sebenarnya adalah beberapa baris (atau lebih) lebih jauh ke bawah, dan Xcode keliru menandai sesuatu yang tidak berbahaya dengan pesan kesalahan. Lihat apakah Anda dapat menghilangkan kesalahan itu dengan menghapus sisa kode Anda, lalu menambahkannya kembali sedikit demi sedikit ...
Nate Cook
Terima kasih Nate - sayangnya saya menghapus vardeklarasi, dan mulai membangun. Lalu saya menambahkan salah satu deklarasi di atas, dan kesalahannya segera kembali: imgur.com/VUUBK2K
Craig Otis

Jawaban:

200

Bagi saya, saya mengalami kesalahan ini ketika target pengujian saya tidak memiliki beberapa file cepat yang dimiliki target build aplikasi saya dalam mengkompilasi sumber. Itu sangat membingungkan karena 'tipe yang tidak dideklarasikan' digunakan di banyak tempat lain tanpa masalah, dan kesalahannya tampak samar. Jadi solusinya tentu saja untuk menambahkan file yang berisi 'tipe yang tidak dideklarasikan' ke target pengujian.

mattorb
sumber
2
Hal yang sama bagi saya: masalah terjadi ketika kelas yang digunakan oleh kelas lain termasuk dalam target Tes, tidak termasuk dalam target Uji juga! (╯ ° □ °) ╯︵ ┻━┻
Francesco Vadicamo
2
Anda baru saja memecahkan masalah yang telah membuat saya jengkel selama setengah jam. Saya telah mengimpor beberapa kelas Swift sebelumnya ke proyek saat ini, tetapi jelas belum menambahkan kelas yang lebih tua ke target pengujian. Tetapi pelengkapan otomatis membuat saya berpikir bahwa semuanya baik-baik saja ... sampai saya mencoba membangun dan berlari. Apa yang ...! Terima kasih banyak.
Jim Hillhouse
2
Ini memecahkan masalah bagi saya juga. Saya telah mengklik file dan file-> menggandakan salinannya. Salinan baru terdaftar tetapi tidak termasuk dalam "kompilasi sumber"
Ron Myschuk
1
Dalam kasus saya, saya telah memilih 3 target (Proyek, UI & Tes unit), saya harus membatalkan pilihan UI & Tes unit untuk menyelesaikan kesalahan ini
Frakcool
1
"Solusi tentu saja ..." mengandaikan bahwa pembaca mengerti bagaimana cara menambahkan target pengujian. Bagi kami yang baru memulai dengan Xcode, ini bukan momen "tentu saja ...". Saya membenarkan jawaban @ edwin saat dia menyelesaikan jawaban Anda.
Michael
181

Ini sudah dijawab oleh @Craig Otis, tetapi masalah ini disebabkan ketika kelas yang bersangkutan tidak termasuk target yang sama, biasanya target tes tidak ada. Pastikan kotak centang berikut dicentang.


target keanggotaan

Edit

Untuk melihat target keanggotaan. Pilih file Anda lalu buka inspektur file (⌥ + ⌘ + 1) [ opsi ] + [ perintah ] + 1

Detil Deskripsi

Edwin
sumber
tidak yakin tetapi ketika saya menghapus centang target "TEST" (dalam hal ini adalah YAWA-WeatherTest). itu dibangun tanpa kesalahan.
dellos
Bisakah Anda menjelaskan di mana di XCode untuk mengatur Keanggotaan Target ini? Saya tidak ingat pernah melihatnya sebelumnya. Terima kasih.
Casey Perkins
2
Memang, hapus centang target pengujian, karena ini sebabnya kami "@testable import ..." di proyek pengujian.
menggambar ..
Cuplikan layar sangat membantu. Terima kasih!
Michael
37

Fiuh, akhirnya didiagnosis ini. Entah bagaimana , file Swift yang menyinggung EditTaskPopoverController.swiftitu berada dalam dua fase build berbeda.

Itu Compile Sourcesbenar, dengan semua file Swift lainnya, tetapi juga , untuk alasan yang sangat aneh, dalam Copy Bundle Resourcesfase juga, bersama dengan semua XIB dan sumber daya gambar saya.

Saya tidak tahu bagaimana sampai di sana, tetapi menghapusnya dari fase build tambahan menyelesaikan masalah.

Craig Otis
sumber
Saya memiliki masalah yang sama ternyata, karena saya menggunakan github.com/kronenthaler/mod-pbxproj dan cepat, saya tidak sengaja menambahkan cepat ke jenis sebagai PBXResourcesBuildPhase, bukan PBXSourcesBuildPhase di mod-pbxproj
richy
2
Pasangan! Life saver, sedang menghancurkan kepalaku untuk ini. Cheers
SparkyRobinson
27

Dalam menu XCode Product-> Clean dan kemudian Product-> Build bekerja untuk saya. Saya mengalami masalah ini ketika menambahkan ViewController baru ke proyek saya di Grup / Folder baru.

Himpunan
sumber
5
2 jam, dan saya tidak pernah berpikir untuk mengklik tombol build untuk memasukkan kerangka kerja setelah menginstal pod ... Saya akan pergi sekarang ...
Cruceo
1
Membuang banyak waktu dengan mencoba jawaban lain tetapi tidak pernah dibersihkan dan dibangun. Terima kasih banyak
Zeero0
Saya mengalami kesalahan ini saat bermain dengan SwiftUI di Xcode 11.0 beta 5, sambil mengikuti tutorial Apple. Kanvas menampilkan dengan benar file lain, tetapi file yang baru ditambahkan melemparkan kesalahan ini, mengatakan LandmarkRow_Previews adalah tipe yang tidak dideklarasikan. Hanya build Clean yang memperbaiki masalahnya.
salo.dm
Jawaban ini setara dengan dukungan Tech: "Sudahkah Anda mencoba me-restart perangkat Anda?" Tip yang bagus :)
turingtested
14

Saya memiliki masalah yang sama persis. Beberapa file dalam kerangka saya tidak dapat dijangkau dari kelas lain dalam modul yang sama.

Untuk beberapa alasan file yang telah ditambahkan ke kerangka kerja di Xcode bukan bagian dari Sumber Kompilasi. Jika file Swift Anda bukan bagian dari kompilasi sumber, Anda perlu menambahkannya dengan mengetuk + dan memilihnya di sembulan.

Tangkapan layar 1

Pastikan juga file tersebut merupakan bagian dari target framework. (Kotak kecil pada tangkapan layar di bawah ini harus diperiksa)

Tangkapan layar 2

Groot
sumber
12

Penyebab saya adalah nama fungsi yang dimulai dengan karakter yang sama dengan tipe:

@IBOutlet weak var tableView: CustomTableView!

dan dalam implementasi saya memiliki fungsi yang dimulai dengan CustomTableView

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

Cara mengatasinya adalah mengubah tanda tangan fungsi sehingga tidak dimulai dengan karakter yang sama dengan tipe (CustomTableView), misalnya:

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

Ini adalah pesan kesalahan yang sangat menyesatkan untuk penyebab sebenarnya dalam kasus saya.

Andrew
sumber
1
Terima kasih banyak telah mengirim perbaikan Andrew ini, itu sangat membantu. Pesan kesalahan tentu menyesatkan.
jjc99
7

Jika ada yang mengalami masalah yang sama tetapi perbaikan Sumber Kompilasi tidak menyelesaikan masalah, me-restart Xcode mungkin (itu bekerja untuk saya). Versi Xcode saya adalah Version 6.1 (6A1052d).

lindon fox
sumber
Restart bekerja untuk saya, meskipun kesalahan muncul lagi setelah build berhasil, tanpa ada perubahan kode lebih lanjut.
Jarang
Restart Xcode memperbaiki begitu banyak masalah, Apple harus benar-benar melakukan sesuatu.
Forge
5

Di aplikasi saya, saya memiliki delegasi aplikasi dan kelas lain yang perlu diakses oleh tes sebagai publik. Seperti yang diuraikan di sini , saya kemudian mengimpor aplikasi saya ke dalam pengujian saya.

Ketika saya baru-baru ini membuat dua kelas baru, target pengujian mereka adalah bagian utama dan pengujian. Menghapus mereka dari keanggotaan mereka dari tes memecahkan masalah.

Nate Uni
sumber
5

Dalam kasus saya, sumber kompilasi TestTarget memiliki file dari Target Utama .

Ref :

Target Tes berisi file dari target utama di kompilasi sumber tab

Kenapa ini terjadi?

  • Ini terjadi karena kami memeriksa asosiasi TestTarget saat membuat file

  • Atau secara manual memeriksa opsi ini dari inspektur.

    Ref :

    Buat File - Tes Target Diperiksa

Bagaimana saya mengatasinya?

  • Saya menghapus file target utama dari kompilasi sumber Target Tes
Ratz
sumber
5

Kadang-kadang kesalahan bisa sangat konyol

Sebelum memeriksa semua solusi di sini, pastikan Anda telah mengimpor semua barang dasar

     import Foundation
     import UIKit

Sangat mungkin bahwa ketika Anda mengimpor beberapa file dari luar ke proyek Anda, yang mungkin melewatkan hal-hal dasar ini seperti yang pernah saya alami.

Suraj K Thomas
sumber
itu terjadi pada saya untuk CLLocationManagerDelegate dan yang harus saya lakukan adalah mengimpor CoreLocation pada file lain ini seperti ugh kenapa saya buang 20 menit.
derek
4

Saya mencoba banyak solusi yang ditawarkan di sini, tetapi akhirnya menghapus file dan membuatnya lagi, dan Xcode mereda: /

Yusuf X
sumber
Ini juga bekerja untuk saya. Menghapus referensi, membersihkan, membangun, lalu menambahkan file lagi.
andnil
TERIMA KASIH! Ini sangat aneh. Hanya bekerja untukku juga. Dihapus lama, menyalin kode lama ke file baru, bahkan tidak perlu membersihkan / membangun.
timman
4

Ini juga dapat terjadi jika Anda secara kebetulan menggunakan nama parameter, dan menyebutnya sama dengan objek.

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

Ini mungkin membantu seseorang.

Saya telah membuat proyek pengujian baru dengan Core Data yang disebut "CoreData". Singkatnya saya mendapat "Penggunaan tipe yang tidak dideklarasikan" untuk NSManagedObjectContext dan kelas Data Inti lainnya. Setelah beberapa upaya mengimpor, menambahkan ke fase Build, dll. Saya telah menghapus proyek dan memulai yang baru yang disebut "TestingCoreData" dan semuanya bekerja dengan baik.

Jangan beri nama (tes) Proyek seperti nama Kelas

Babac
sumber
3

Ini juga bisa terjadi jika Anda memiliki fungsi dengan nama yang sama dengan jenis objek di tanda tangan Anda. Sebagai contoh:

class func Player(playerObj: Player)

akan menyebabkan kompiler menjadi bingung (dan memang seharusnya begitu) karena kompiler pertama-tama akan melihat secara lokal di dalam file sebelum melihat file lain. Jadi terlihat pada "Player" di tanda tangan dan berpikir, itu bukan objek dalam lingkup ini, tetapi fungsi, jadi ada sesuatu yang salah.

Mungkin ini adalah alasan bagus mengapa saya tidak harus menggunakan fungsi kelas. :)

Maxwell
sumber
3

Saya mendapat pesan kesalahan ini di Xcode 8 saat refactoring kode ke kerangka kerja, ternyata saya lupa menyatakan kelas dalam kerangka kerja sebagai public

tsuchi.one
sumber
2

Mungkin Anda telah menambahkan kelas dengan beberapa "FirstNameClass" dan setelah itu secara manual ganti nama menjadi "ColoredDotView". Cobalah untuk menyalin konten dari kelas "ColoredDotView" ke clipboard, hapus "ColoredDotView" dari proyek dan tambahkan lagi.

Id ini memperbaiki masalah yang sama dari saya.

Almin
sumber
2

Dalam kasus saya adalah kesalahan yang saya buat. Saya menambahkan file baru sebagai "OS X> Sumber> Cocoa Class", bukan "iOS> Source> Cocoa Touch Class".

Javier Calatrava Llavería
sumber
2

Dalam kasus saya, ini disebabkan oleh nama subkelas yang digunakan di baris berikutnya sebagai nama variabel dengan tipe yang berbeda:

var binGlow: pipGlow = pipGlow(style: "Bin")
var pipGlow: PipGlowSprite = PipGlowSprite()

Perhatikan bahwa pada baris 1, pipGlow adalah nama subclass (dari SKShapeNode), tetapi di baris dua, saya menggunakan pipGlow sebagai nama variabel. Ini bukan hanya gaya pengkodean yang buruk, tapi juga jelas tidak-tidak! Setelah saya mengubah baris kedua menjadi:

var binGlow: pipGlow = pipGlow(style: "Bin")
var pipGlowSprite: PipGlowSprite = PipGlowSprite()

Saya tidak lagi menerima kesalahan. Saya harap ini membantu seseorang!

zeeple
sumber
2

Saat menguji kode Swift yang termasuk dalam aplikasi, pertama-tama pastikan target pengujian membangun aplikasi sebagai ketergantungan. Kemudian, dalam pengujian Anda, impor aplikasi sebagai modul. Sebagai contoh:

@testable import MyApplication

Ini akan membuat objek Swift yang merupakan bagian dari aplikasi tersedia untuk pengujian.

quellish
sumber
2

Dalam kasus saya, itu disebabkan oleh Pengodean Teks file cepat. Satu file menunjukkan 'No Encicit Encoding', dan setelah dikonversi menjadi 'UTF-8', masalah terpecahkan.

Dan alasan mengapa pengkodean teks file tidak eksplisit adalah karena saya menyalin semua kode dari file cepat lainnya.

Tidak Ada Screenshot Pengodean Eksplisit

masukkan deskripsi gambar di sini

Screenshot UTF-8

masukkan deskripsi gambar di sini

Jirui
sumber
2

Membersihkan proyek memecahkan masalah saya.

Langkah-langkah: Produk -> Bersihkan (atau Shift + Cmd + K)

Anshul Tiwari
sumber
1

Dalam kasus saya, saya ingin menambahkan metode dengan objek swift kustom sebagai parameter tipe, dan nama yang saya berikan ke variabel dalam parameter persis sama dengan nama kelas objek kustom

Masalahnya kira-kira seperti ini:

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

Bagian dalam karakter tebal menyebabkan kesalahan tipe yang tidak dideklarasikan

cmario
sumber
1

seperti yang lainnya disebutkan dengan baik dan di utas ini

penggunaan file cepat yang tidak dibutuhkan dalam "salin bundel sumber daya" tangkapan layar untuk membantu

Hamed Nova
sumber
1

Seperti yang lain, itu adalah beberapa kode yang tidak terkait yang menyebabkan @testable kegagalan fungsi.

Di target pengujian saya ada file header Objective-C yang punya

@import ModuleUnderTest;

Saya menghapus baris ini (karena impor sebenarnya tidak perlu) dan secara ajaib @testablemulai bekerja lagi.

Saya hanya dapat melacak ini tetapi menghapus semuanya dari proyek saya dan menambahkannya kembali sedikit demi sedikit sampai gagal. Akhirnya saya menemukan garis masalah kode.

Oliver Pearmain
sumber
1

jika Anda mengaksesnya dari yang berbeda moduleatau TargetAnda hanya perlu publicmelakukannya

Sultan Ali
sumber
1

Jika seseorang membuat kesalahan konyol yang sama saya lakukan ...

Saya mendapatkan kesalahan ini karena dalam mengganti nama file sumber saya, saya tidak sengaja menghapus file. dari nama file dan kompiler memperlakukan file tersebut sebagai file teks biasa dan bukan sebagai sumber untuk dikompilasi.

jadi saya bermaksud untuk mengganti nama file MyProtocol.swift tetapi tidak sengaja menamainya MyProtocolswift

Ini kesalahan sederhana, tetapi tidak segera jelas bahwa inilah yang sedang terjadi.

Marc Renaud
sumber
1

Tidak menambahkan delcarasi impor yang benar juga bisa menjadi kesalahan. Bagi saya, saya hanya dihilangkan untuk mengimpor PriorityUIKit.

Stempel
sumber
1

Situasi saya adalah saya menyeret file baru XXView.swift ke proyek. Dan menyatakan tipe tampilan menjadi XXView maka kesalahan "penggunaan tipe yang tidak dideklarasikan ....".

Saya hanya mencoba menambahkan XXView.swift saya ke target pengujian yang memecahkan kesalahan. Tapi saya tidak ingin Kelas UI saya terlibat dalam target tes.

Akhirnya, saya menemukan ViewController saya sudah dalam target uji yang seharusnya tidak terjadi. (Saya pikir karena saya membuat VC oleh xctemplate karena itu, secara otomatis dimasukkan dalam target pengujian)

Saya menghapus view controller dari target pengujian, dan kemudian XXView saya sekarang tidak perlu ditambahkan ke target pengujian.

Kesimpulan: pastikan semua file terkait Anda juga harus menghapus centang pada target pengujian.

Wangdu Lin
sumber
1

Setelah menghabiskan satu jam pada kesalahan ini, saya menemukan bahwa file modul digandakan. hapus file ekstra, dan geser + cmd + k untuk membersihkan dan kesalahannya hilang.

Alirza Eram
sumber
Ini mungkin pertanyaan bodoh tapi bisakah Anda menjelaskan lebih banyak tentang itu? Apakah ini terjadi dengan file swift duplikat juga, atau grup duplikat dll ..? Itu bekerja tetapi saya ingin tahu lebih banyak tentang mengapa ia bekerja daripada hanya menerima bahwa itu bekerja. Omong-omong, terima kasih atas solusinya!
Cody Vollrath
1

Dalam kasus saya, masalah dengan yang baru classtidak diakui. Saya memecahkan masalah dengan menghapus kelas dan menambahkannya kembali tetapi kali ini memeriksa Watch App Extensionopsi saat membuat kelas baru.

masukkan deskripsi gambar di sini

Harap perhatikan bahwa saya memiliki Ekstensi Aplikasi Tontonan di Aplikasi saya.

fs_tigre
sumber
Terima kasih dan dalam kasus saya juga hanya perlu menambahkan file ke yang benar Target.
coletrain