Tür dahili olmasına ve aynı modülde bulunmasına rağmen Swift'te “bildirilmemiş tür kullanımı”


173

Modülümde bir tür var:

import Cocoa

class ColoredDotView : NSView {
   ...
}

Sorunsuz bir dizi farklı sınıfta kullanılır:

class EditSubjectPopoverController : NSObject {

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

Ama bazı nedenlerden dolayı , belirli bir sınıfta kullandığımda, tür üzerinde derleme hataları var:

class EditTaskPopoverController : NSObject {

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

Derleme hatası:

EditTaskPopoverController.swift: 15: 49: Belirtilmemiş 'ColoredDotView' türünün kullanımı

Hangi anlamıyorum. Dosyadaki ilk derleme hatasıdır ve hataların geri kalanı birincisinin semptomatiktir. Ayrıca, derleme hataları olan başka dosya yoktur . Dosya aynı modülde olduğu gibi, tipin neden bildirilmediğini anlamıyorum:

resim açıklamasını buraya girin

Projeyi temizlemeyi, yapı klasörünü temizlemeyi ve Xcode'u yeniden başlatmayı boşuna denedim. Hangi potansiyel yanlış adımlar undeclared typeSwift'te derleyici hatasına neden olabilir ?


Gerçek hata birkaç satır (veya daha fazla) daha aşağı olduğu bir sürü durum yaşadım ve Xcode yanlışlıkla bir hata mesajı ile zararsız bir şey etiketleri. Kodunuzun geri kalanını silerek gidermek için bu hatayı alıp alamayacağınıza bakın, sonra yavaşça geri ekleyin ...
Nate Cook

Teşekkürler Nate - ne yazık ki varbeyanları kaldırıyorum ve geçen bir yapıya iniyorum. Sonra en üstteki beyanlardan birini ekliyorum ve hata hemen geri döndü: imgur.com/VUUBK2K
Craig Otis

Yanıtlar:


200

Test hedefimde uygulama oluşturma hedefimin derleme kaynaklarında bulunduğu bazı hızlı dosyalar olmadığında benim için bu hatayla karşılaştım. Çok kafa karıştırıcıydı çünkü 'ilan edilmemiş tip' sorunsuz başka pek çok yerde kullanılıyordu ve hata belirsiz görünüyordu. Bu yüzden çözüm, 'hedeflenmemiş tip' içeren dosyayı test hedefine eklemek için elbette çözüm oldu.


2
Benim için de aynısı: Test hedefine dahil olan başka bir sınıf tarafından kullanılan bir sınıf Test hedefine de dahil edilmediğinde sorun ortaya çıkar! (□ ° □ °) ╯︵ ┻━┻
Francesco Vadicamo

2
Beni yarım saat boyunca rahatsız eden bir sorunu çözdün. Önceki Swift sınıflarından bazılarını geçerli bir projeye aktarmıştım, ancak daha eski sınıfları henüz test hedefine eklememiştim. Ama otomatik tamamlama beni her şeyin yolunda olduğunu düşünmeye itti ... inşa edip koşmaya çalışana kadar. Ne ...! Çok teşekkür ederim.
Jim Hillhouse

2
Bu da benim için sorunu çözdü. Bir dosyaya tıkladım ve dosya-> bir kopyasını kopyaladım. Yeni kopya listelenmiş ancak "derleme kaynaklarına" dahil edilmemiştir
Ron Myschuk

1
Benim durumumda 3 hedef seçtim (Proje, UI ve Birim testleri), bu hatayı çözmek için UI ve Birim testleri hedeflerinin seçimini kaldırmak zorunda kaldım
Frakcool

1
"Elbette ki çözüm ..." okuyucunun test hedefini nasıl ekleyeceğini anladığını varsayar. Bizim için sadece Xcode ile başlayalım, bu bir "elbette ..." anı değil. Cevabınızı bitirirken @ edwin'in cevabını iptal ettim.
Michael

181

Bu, @Craig Otis tarafından zaten cevaplanmıştır, ancak söz konusu sınıflar aynı hedeflere ait olmadığında, genellikle test hedefi eksik olduğunda soruna neden olur. Aşağıdaki onay kutularının işaretli olduğundan emin olun.


hedef üyelik

Düzenle

Hedef üyeliği görmek için. Dosyanızı seçin ve ardından dosya denetçisini açın (⌥ + ⌘ + 1) [ seçenek ] + [ komut ] + 1

Detaylı Açıklama


emin değilim ama "TEST" hedef işaretini kaldırdığımda (bu durumda YAWA-WeatherTest). hatasız inşa edilmiştir.
dellos

Bu Hedef Üyeliği belirlemek için XCode'da nerede olduğunu açıklayabilir misiniz? Daha önce gördüğümü hatırlamıyorum. Teşekkürler.
Casey Perkins

2
Gerçekten de, test hedeflerinin işaretini kaldırın, çünkü bu yüzden test projelerinde "@testable import ...".
çizdi ..

Ekran görüntüsü çok faydalı. Teşekkürler!
Michael

37

Vay be, sonunda bunu teşhis etti. Her nasılsa , rahatsız edici Swift dosyası EditTaskPopoverController.swiftiki farklı inşa aşamasındaydı.

O oldu Compile Sources, diğer tüm Swift dosyaları ile düzgün, ama öyleydi de olmak üzere bazı çok garip bir nedenden dolayı, Copy Bundle Resourcesbütün XIB ve görüntü kaynakları ile birlikte, hem de faz.

Oraya nasıl geldiğine dair hiçbir fikrim yok, ancak ekstra yapı aşamasından kaldırmak sorunu çözdü.


Ben ortaya çıktı aynı sorun vardı, çünkü github.com/kronenthaler/mod-pbxproj ve swift kullanıyordum , yanlışlıkla PBXSourcesBuildPhase mod-pbxproj yerine türlerine hızlı ekledim
zengin

2
Dostum! Hayat kurtarıcı, bunun üzerine kafamı yıkıyordu. Şerefe
SparkyRobinson

27

XCode menüsünde Product-> Clean ve ardından Product-> Build benim için çalıştı. Yeni Grup / Klasör projeme yeni ViewController eklendiğinde bu sorunla karşılaştım.


5
2 saat, ve bir kez bir kapsül kurduktan sonra çerçeveyi dahil etmek için inşa düğmesine tıklamayı düşünmedim ... Şimdi
gideceğim

1
Diğer cevapları deneyerek çok zaman harcadım ama asla temizlenip inşa edilmedi. Çok teşekkürler
Zeero0

Apple öğreticisini takip ederken Xcode 11.0 beta 5'de SwiftUI ile oynarken bu hatayı aldım. Tuval, diğer dosyaları düzgün bir şekilde görüntülüyordu, ancak yeni eklenen bir dosya, LandmarkRow_Previews'in bildirilmemiş bir tür olduğunu söyleyerek bu hatayı attı. Sadece Build Clean sorunu düzeltti.
salo.dm

Bu yanıt Teknik desteklerin eşdeğeridir: "Cihazınızı yeniden başlatmayı denediniz mi?" İyi bir ipucu :)
turingtested

14

Ben de aynı problemi yaşadım. Çerçevemdeki bazı dosyalara aynı modül içindeki diğer sınıflardan erişilemedi.

Bazı nedenlerden dolayı Xcode'daki çerçeveye eklenen dosyalar Derleme Kaynaklarının bir parçası değildi. Swift dosyanız derleme kaynaklarının bir parçası değilse + işaretine dokunup açılır pencerede seçerek bunları eklemeniz gerekir.

Ekran görüntüsü 1

Ayrıca dosyanın çerçeve hedefinin bir parçası olduğundan emin olun. (Aşağıdaki ekran görüntüsünde küçük kutu işaretlenmelidir)

Ekran görüntüsü 2


12

Benim için neden, bir türle aynı karakterlerle başlayan bir işlev adıydı:

@IBOutlet weak var tableView: CustomTableView!

ve uygulamada CustomTableView ile başlayan bir fonksiyonum vardı

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

Düzeltme, işlev imzasını türle (CustomTableView) aynı karakterlerle başlamaması için değiştirmekti, ör:

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

Bu benim durumumda gerçek nedeni için çok yanıltıcı bir hata mesajı oldu.


1
Bu düzeltmeyi gönderdiğiniz için çok teşekkürler Andrew, çok yardımcı oldu. Hata mesajı kesinlikle yanıltıcıdır.
jjc99

7

Herkes benzer bir sorunla karşılaşırsa, ancak Derleme Kaynakları düzeltmesi sorunu çözmezse, Xcode'u yeniden başlatmak (benim için çalıştı) olabilir. Xcode sürümüm Version 6.1 (6A1052d).


Yeniden başlatma benim için çalıştı, ancak başarılı bir derlemeden sonra hata başka bir değişiklik yapılmadan tekrar açıldı.
Yaygın olmayan

Xcode'u yeniden başlatmak çok fazla sorunu çözüyor, Apple gerçekten bu konuda bir şeyler yapmalı.
Forge

5

Uygulamamda uygulama temsilcisi ve testler tarafından halka açık olarak erişilmesi gereken diğer sınıflar var. Burada belirtildiği gibi , daha sonra uygulamamı testlerime aktarıyorum.

Yakın zamanda iki yeni sınıf oluşturduğumda, test hedefleri hem ana hem de test parçalarıydı. Onları testlerinden üyeliklerinden çıkarmak sorunu çözdü.


5

Benim durumumda, TestTarget'ın derleme kaynakları Ana Hedef'ten dosyalara sahipti .

Referans :

Test Hedefi, derleme kaynakları sekmesinde ana hedeften dosyalar içeriyor

Bu neden oluyor?

  • Bu, dosyayı oluştururken TestTarget ilişkilendirmesini kontrol ettiğimiz için olur

  • Veya bu seçeneği denetçiden manuel olarak kontrol edin.

    Referans :

    Dosya Oluştur - Test Hedefi Kontrol Edildi

Nasıl çözdüm?

  • Ana hedefin dosyalarını Test Hedefi derlemesinden kaldırdım

5

Bazen hatalar çok saçma olabilir

Buradaki tüm çözümleri kontrol etmeden önce, tüm temel şeyleri içe aktardığınızdan emin olun.

     import Foundation
     import UIKit

Bazı dosyaları dışarıdan projenize aktardığınızda, bir kez yaşadığım gibi bu temel şeyleri kaçırabilir.


CLLocationManagerDelegate için başıma geldi ve tek yapmam gereken CoreLocation'u bu diğer dosyaya neden aktarmaktı, neden 20 dakika harcadım.
derek

4

Burada sunulan çözümlerin çoğunu denedim, ancak sonunda dosyayı sildim ve tekrar oluşturdum ve Xcode mollified edildi: /


Bu benim için de işe yaradı. Referans kaldırıldı, temizlendi, derlendi, sonra dosyayı tekrar eklendi.
andynil

TEŞEKKÜR EDERİM! Bu oldukça tuhaf. Sadece benim için de çalıştı. Eski silindi, eski kodu yeni dosyaya kopyaladı, temizlemek / derlemek zorunda bile değildi.
timman

4

Bu, yanlışlıkla parametre adını büyük harfle yazıp nesne ile aynı şekilde çağırırsanız da olabilir.

class func didRecieveData(BlockItems: [BlockItems])

3

Bu birine yardımcı olabilir.

"CoreData" adlı Core Data ile yeni bir test projesi oluşturdum. Kısaca NSManagedObjectContext ve diğer Core Data sınıfları için "İlan edilmemiş tür kullanımı" var. İçe aktarma, Derleme aşamaları, vb. Ekleme denemelerinden sonra projeyi sildim ve "TestingCoreData" adlı yeni bir tane başlattım ve hepsi iyi çalıştı.

Sınıfların adı gibi projeleri adlandırma (test etme)


3

Bu, imzanızdaki bir nesne türüyle aynı ada sahip bir işleviniz varsa da olabilir. Örneğin:

class func Player(playerObj: Player)

derleyici, diğer dosyalara bakmadan önce dosyanın içinde yerel olarak görüneceğinden (ve haklı olarak) karışmasına neden olur. İmzadaki "Oyuncu" ya bakar ve bu kapsamdaki bir nesne değil, bir işlev olduğunu düşünür, bu yüzden bir şeyler yanlıştır.

Belki de bu, sınıf işlevlerini büyük harfle kullanmamamın iyi bir nedenidir. :)


3

Kod bir çerçeveye yeniden düzenlerken Xcode 8'de bu hata iletisini aldım, bu çerçevede sınıf olarak ilan etmeyi unuttum public


2

Belki bazı "FirstNameClass" ile sınıf eklediniz ve bundan sonra el ile "ColoredDotView" olarak yeniden adlandırın. "ColoredDotView" sınıfının içeriğini panoya kopyalamaya çalışın, "ColoredDotView" projesinden kaldırın ve hedef ekleyin.

Bu kimlik benden benzer sorunu düzeltti.


2

Benim durumumda yaptığım bir hataydı. "İOS> Kaynak> Kakao Dokunma Sınıfı" yerine "OS X> Kaynak> Kakao Sınıfı" olarak yeni bir dosya ekledim.


2

Benim durumumda, bunun nedeni, bir sonraki satırda farklı türde bir değişken adı olarak bir alt sınıf adının kullanılmasıydı:

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

1. satırda pipGlow'un (SKShapeNode öğesinin) alt sınıfının adı olduğuna dikkat edin, ancak ikinci satırda değişken adı olarak pipGlow kullandım. Bu sadece kötü kodlama tarzı değil, aynı zamanda açıkça hayır-hayır! İkinci satırı şu şekilde değiştirdim:

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

Artık hatayı almadım. Umarım bu birine yardımcı olur!


2

Uygulamaya ait Swift kodunu test ederken, öncelikle test hedefinin uygulamayı bağımlılık olarak oluşturduğundan emin olun. Ardından, testinizde uygulamayı modül olarak içe aktarın. Örneğin:

@testable import MyApplication

Bu, uygulamanın bir parçası olan Swift nesnelerini sınama için kullanılabilir hale getirecektir.


2

Benim durumumda, bu hızlı dosyaların Metin Kodlaması neden oldu. Bir dosya 'Açık Kodlama Yok' gösterdi ve bunu 'UTF-8' e dönüştürdükten sonra sorun çözüldü.

Dosyanın metin kodlamasının açık olmamasının nedeni, tüm kodu diğer hızlı dosyadan kopyalamam.

Ekran Görüntüsü Yok Açık Kodlama

resim açıklamasını buraya girin

UTF-8 Ekran Görüntüsü

resim açıklamasını buraya girin


2

Projeyi temizlemek sorunumu çözdü.

Adımlar: Ürün -> Temizle (veya Üst Karakter + Cmd + K)


1

Benim durumumda bir type parametresi olarak özel bir swift nesnesi olan bir yöntem eklemek istedim ve parametredeki değişkene verdiğim ad, özel nesne sınıfı adıyla tam olarak aynıydı

Sorunlar şöyleydi:

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

Kalın harflerle yazılan bölüm bildirilmemiş tipte hataya neden oluyordu


1

Diğerlerinin de belirttiği gibi ve bu konuda

"paket kaynaklarını kopyalama" dosyasında gereksiz hızlı dosyaların kullanılması yardım için ekran görüntüsü


1

Diğerleri gibi, @testablearızaya neden olan ilgisiz bir koddu.

Test hedefimde Objective-C başlık dosyası vardı

@import ModuleUnderTest;

Bu satırı kaldırdım (içe aktarma aslında gereksizdi) ve mucizevi bir şekilde @testabletekrar çalışmaya başladım .

Sadece bunu izleyebildim, ancak projemden her şeyi kaldırarak başarısız olana kadar yavaş yavaş geri ekledim. Sonunda sorun kod satırını buldum.


1

farklı bir yerden erişiyorsanız moduleya da Targetona ihtiyacınız publicvarsa


1

Birisi benim yaptığım aynı saçma hatayı yaparsa ...

Bu hatayı alıyorum çünkü kaynak dosyamı yeniden adlandırırken, yanlışlıkla dosya adından kaldırdım .ve derleyici dosyayı derlemek için kaynak olarak değil, düz metin dosyası olarak ele aldı.

bu yüzden dosyayı yeniden adlandırmak istedim MyProtocol.swift ama yanlışlıkla adını verdim MyProtocolswift

Bu basit bir hata, ama olanların bu olduğu açıkça belli değildi.


1

Doğru ithalat delcarationunu eklememek de bariz bir özlem olabilir. Benim için, PriorityUIKit'i ithal etmeyi ihmal ettim.


1

Benim durumum, projeye XXView.swift yeni bir dosya sürükleyin olmasıdır. Ve bir Görünüm türü XXView sonra "bildirilmemiş tür kullanımı ...." hatasını bildirin.

Sadece benim XXView.swift hata çözüldü test hedef eklemek için deneyin. Ancak UI Sınıfımın test hedefine dahil olmasını istemedim.

Son olarak, ViewController'ımı zaten olmamak üzere test hedefinde buldum. (Bence bir xctemplate tarafından VC oluşturduğum için otomatik olarak test hedefine dahil edilir)

Görünüm denetleyicisini test hedefinden kaldırıyorum ve sonra XXView'ım artık test hedefine eklemeye gerek yok.

Sonuç: İlgili tüm dosyalarınızın test hedefinin işaretini kaldırması gerektiğinden emin olun.


1

Bu hatayı bir saat geçirdikten sonra modül dosyasının çoğaltıldığını gördüm. ekstra dosyayı silin ve temizlemek için + cmd + k tuşlarını kaydırın ve hata gitti.


Bu aptalca bir soru olabilir ama bunun hakkında daha fazla açıklama yapabilir misiniz? Bu yinelenen hızlı dosyalar veya yinelenen gruplar vb. İle olur mu? İşe yaradı ama neden işe yaradığını, sadece işe yaradığını kabul etmekten daha çok bilmek istiyorum. Bu arada çözüm için teşekkürler!
Cody Vollrath

1

Benim durumumda, sorun yeni bir classtanınmadı. Sınıfı silerek ve yeniden ekleyerek sorunu çözdüm, ancak bu sefer Watch App Extensionyeni sınıfı oluştururken seçeneği kontrol edin .

resim açıklamasını buraya girin

Uygulamamda bir Saat Uygulaması Uzantısı olduğunu lütfen unutmayın.


Teşekkürler ve benim durumumda da sadece doğru dosya eklemek gerekiyordu Target.
coletrain
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.