"Использование необъявленного типа" в Swift, хотя тип является внутренним и существует в том же модуле

В моем модуле есть тип:

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'

Что я не понимаю. Это первая ошибка компиляции в файле, а остальные ошибки являются симптомами первого. Кроме того, нет других файлов с ошибками компиляции. Я не понимаю, почему этот тип не объявлен, так как файл находится в одном модуле:

enter image description here

Я пробовал очистить проект, очистить папку сборки и перезапустить Xcode, но безрезультатно. Какие потенциальные ошибки могут вызвать ошибку компилятора undeclared type в Swift?

Ответ 1

Фью, наконец, поставил диагноз. Так или иначе, оскорбительный файл Swift EditTaskPopoverController.swift находился в двух разных фазах сборки.

Это было в Compile Sources правильно, со всеми другими файлами Swift, но также по какой-то очень странной причине в фазе Copy Bundle Resources вместе со всеми моими ресурсами XIB и изображений.

Я понятия не имею, как это произошло, но удаление его с дополнительной фазы сборки разрешило проблему.

Ответ 2

Для меня я столкнулся с этой ошибкой, когда у моей тестовой цели не было быстрых файлов, которые моя цель создания приложения находилась в источниках компиляции. Это было очень запутанно, потому что "необъявленный тип" использовался во многих других местах без проблем, и ошибка казалась расплывчатой. Поэтому решение было, конечно, добавить файл, содержащий "необъявленный тип", в тестовый объект.

Ответ 3

Об этом уже ответил @Craig Otis, но проблема возникает, когда рассматриваемые классы не принадлежат к одним и тем же объектам, обычно цель тестирования отсутствует. Просто убедитесь, что отмечены следующие флажки.


target membership

Изменить

Чтобы увидеть целевое членство. Выберите файл, затем откройте инспектор файлов (⌥ + ⌘ + 1) [ вариант] + [ команда] + 1

detailed description

Ответ 4

В меню XCode Product- > Clean, а затем Product- > Build работал у меня. Я столкнулся с этой проблемой при добавлении нового ViewController в мой проект в новой группе/папке.

Ответ 5

Причиной для меня было имя функции, которое начиналось с тех же символов, что и тип:

@IBOutlet weak var tableView: CustomTableView!

и в реализации у меня была функция, начинающаяся с CustomTableView

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

Исправление заключалось в изменении сигнатуры функции, чтобы она не начиналась с тех же символов, что и тип (CustomTableView), например:

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

Это было очень ошибочное сообщение об ошибке для фактической причины в моем случае.

Ответ 6

У меня была точно такая же проблема. Некоторые файлы в моей структуре не были доступны из других классов в том же модуле.

По некоторым причинам файлы, которые были добавлены к платформе в XCode, не были частью Источников Компиляции. Если ваш файл Swift не является частью исходников компиляции, вам нужно добавить их, нажав + и выбрав их во всплывающем окне.

Screenshot 1

Также убедитесь, что файл является частью целевой платформы. (Маленький флажок на скриншоте ниже должен быть отмечен)

Screenshot 2

Ответ 7

В моем приложении у меня есть делегат приложения и другие классы, к которым тесты должны быть доступны публично. Как указано здесь, я затем импортирую свое приложение в свои тесты.

Когда я недавно создал два новых класса, их тестовые цели были как основной, так и тестовой частью. Удаление из их членства из тестов решило проблему.

Ответ 8

В случае, если кто-либо сталкивается с аналогичной проблемой, но Исходные исправления компиляции не решает проблему, перезапуск Xcode может (это сработало для меня). Моя версия Xcode Version 6.1 (6A1052d).

Ответ 9

Это также может произойти, если вы случайно воспользуетесь именем параметра и назовите его так же, как и объект.

class func didRecieveData(BlockItems: [BlockItems])

Ответ 10

В моем случае источники компиляции TestTarget имели файлы из главной цели.

Ref:

Test Target contains files from main target in compile sources tab

Почему это происходит?

  • Это происходит, так как мы проверяем связь TestTarget при создании файл

  • Или проверьте эту опцию вручную у инспектора.

    Ref:

    Create File - Test Target is Checked

Как я решил?

  • Я удалил основные целевые файлы из источника компиляции Test Target

Ответ 11

Это может помочь кому-то.

Я создал новый тестовый проект с Core Data, называемый CoreData. Вскоре у меня есть "Использование необъявленного типа" для классов NSManagedObjectContext и других классов Core Data. После нескольких попыток импорта, добавления фаз сборки и т.д. Я удалил проект и начал новый, называемый "TestingCoreData", и все это работало хорошо.

Не называть (тестировать) проекты, такие как имя классов

Ответ 12

Я попробовал множество предлагаемых решений, но в итоге удалил файл и снова создал его, а Xcode был смягчен:/

Ответ 13

Это также может произойти, если в вашей сигнатуре есть функция с тем же именем, что и тип объекта. Например:

class func Player(playerObj: Player)

заставит компилятор запутаться (и это правильно), поскольку компилятор сначала будет искать локально внутри файла, прежде чем смотреть на другие файлы. Поэтому он смотрит на "Player" в подписи и думает, что это не объект в этой области, а функция, поэтому что-то не так.

Возможно, это хорошая причина, почему я не должен использовать функции класса.:)

Ответ 14

Я получил это сообщение об ошибке в Xcode 8 при реорганизации кода в фреймворк, выясняется, что я забыл объявить класс в рамках public

Ответ 15

В моем случае была ошибка, сделанная мной. Я добавил новый файл как "OS X > Source > Cocoa Class" вместо "iOS > Source > Cocoa Touch Class".

Ответ 16

В моем случае это было вызвано тем, что имя подкласса используется в самой следующей строке как имя переменной с другим типом:

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

Обратите внимание, что в строке 1 pipGlow является именем подкласса (SKShapeNode), но во второй строке я использовал pipGlow в качестве имени переменной. Это был не только плохой стиль кодирования, но, по-видимому, прямой и нет-нет! Как только я изменил вторую строку на:

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

Я больше не получил ошибку. Надеюсь, это поможет кому-то!

Ответ 17

При тестировании кода Swift, который принадлежит к приложению, сначала убедитесь, что цель тестирования заключается в создании приложения как зависимости. Затем в своем тесте импортируйте приложение в виде модуля. Например:

@testable import MyApplication

Это сделает объекты Swift, которые являются частью приложения, доступными для теста.

Ответ 18

Очистка проекта решила мою проблему.

шаги: Продукт → Очистить (или Shift + Cmd + K)

Ответ 19

Возможно, вы добавили класс с некоторым "FirstNameClass" и после этого вручную переименуете в "ColoredDotView" . Попробуйте скопировать содержимое класса "ColoredDotView" в буфер обмена, удалите "ColoredDotView" из проекта и добавьте аги.

Этот идентификатор исправляет аналогичную проблему у меня.

Ответ 20

В моем случае я хотел добавить метод с пользовательским swift-объектом в качестве параметра типа, а имя, которое я дал переменной в параметре, было точно таким же, как имя класса пользовательского объекта

Проблемы были примерно такими:

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

Часть в жирных символах вызывала ошибку необъявленного типа

Ответ 21

как хорошо упоминались и в этой теме

использование ненужных быстрых файлов в "ресурсах связки копий" снимок экрана для помощи

Ответ 22

Как и другие, это был какой-то не связанный код, который вызывал сбой @testable.

В моем тестовом объекте был заголовочный файл Objective-C, который имел

@import ModuleUnderTest;

Я удалил эту строку (потому что импорт фактически был не нужен) и чудесным образом @testable снова начал работать.

Я мог только отследить это, но удалял все из моего проекта и добавлял его постепенно, пока не потерпел неудачу. В конце концов я нашел проблемную строку кода.

Ответ 23

В моем случае это было вызвано быстрыми файлами Text Encoding. Один файл показывал "Нет явного кодирования", и после преобразования его в "UTF-8" проблема решена.

И причина, по которой кодировка текста файла не является явной, заключается в том, что я скопировал весь код из другого файла swift.

Снимок экрана без явного кодирования

enter image description here

Снимок экрана UTF-8

enter image description here

Ответ 24

если вы обращаетесь к нему из другого module или Target, то вам просто нужно public его

Ответ 25

На случай, если кто-то совершит ту же глупую ошибку, что и я...

Я получал эту ошибку, потому что при переименовании моего исходного файла я случайно удалил . из имени файла, и поэтому компилятор рассматривал этот файл как простой текстовый файл, а не как источник для компиляции.

поэтому я хотел переименовать файл в MyProtocol.swift но случайно назвал это MyProtocolswift

Это простая ошибка, но было не совсем очевидно, что это происходит.

Ответ 26

Неправильное добавление правильной разметки импорта также может быть очевидной ошибкой. Для меня я просто пропустил импорт PriorityUIKit.

Ответ 27

   Иногда ошибки могут быть очень глупыми

Прежде чем проверить все решения здесь, убедитесь, что у вас есть импортированы все основные вещи

     import Foundation
     import UIKit

Вполне возможно, что при импорте некоторых файлов извне к вашему проекту, который может пропустить эти основные вещи, как я испытал один раз.

Ответ 28

Моя ситуация такова, что я перетаскиваю новый файл XXView.swift в проект. И объявите тип View как XXView, а затем ошибку "использование необъявленного типа....".

Я просто пытаюсь добавить свой XXView.swift к цели теста, в которой он решил ошибку. Но я не хотел, чтобы мой класс пользовательского интерфейса участвовал в тестировании.

Наконец, я обнаружил, что мой ViewController уже находится в тестовой цели, чего не должно быть. (Я думаю, потому что я создаю VC с помощью xctemplate, поэтому он автоматически включается в цель теста)

Я удаляю контроллер представления из контрольной цели, и теперь мой XXView больше не нужно добавлять в контрольную цель.

Вывод: убедитесь, что все ваши связанные файлы также не отмечены цели теста.

Ответ 29

Была ошибка с типом Int, из-за ссылки на локальный case в моем перечислении с именем .Int

func foo() { switch self { case .Int(var info): // ..... some other code } }

Там была ошибка. someFuncWithInt(parameter: Int)

Исправлено someFuncWithInt(parameter: Swift.Int)

Ответ 30

Потратив час на эту ошибку, я обнаружил, что файл модуля продублирован. удалите лишний файл, и Shift + CMD + K для очистки и ошибка исчезла.