Swift, не может отличить значение типа

Я создал подкласс UICollectionViewController и назвал его LibraryCollectionViewController и пометил оба флажка для проекта и теста. Также это идентификатор раскадровки LibraryCollectionViewController и устанавливает соответствующий класс в построителе интерфейса.

Являясь новым для Swift и тестирования iOS, я пошел и попытался создать экземпляр указанного контроллера представления в моем тестовом примере следующим образом:

let storyboard = UIStoryboard(name: "Main", bundle: nil)
let libraryCollectionVC = storyboard.instantiateViewControllerWithIdentifier("LibraryCollectionViewController") as! LibraryCollectionViewController

И я получаю следующую ошибку:

Could not cast value of type 'MyApp.LibraryCollectionViewController' (0x1010b01f0) to 'MyAppTests.LibraryCollectionViewController' (0x10bd7f580).

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

  • Я сделал что-то неправильно при создании подкласса, и я ссылаюсь на другой (Ergo MyApp. vc) vs MyAppTests. [vc])
  • Неправильное использование as!
  • Любая другая причина

Любая помощь будет оценена, спасибо заранее.

Обновление 1:. Когда я создавал контроллер представления, последний шаг показывает 2 флажка под заголовком Target, я включил оба из них, может быть, это и есть причина

Ответ 1

Моя проблема заключалась в том, что я ссылался на NSBundle.mainBundle() на модульные тесты, тогда как мне нужно было использовать:

let bundle = NSBundle(forClass: self.classForCoder)

Ответ 2

Попробуйте следующее:

  • Открыть LibraryCollectionViewController.swift
  • Нажмите Option + Command + 1, чтобы открыть File Inspector
  • Найти целевое членство
  • Отметьте MyApp

Ответ 3

У меня была такая же проблема. Вам необходимо:

  • Удалите свой класс и его файл.
  • Откройте файл xcdatamodeld.
  • Выберите класс, вызывающий проблемы.
  • Нажмите "Редактор" на Xcode.
  • Нажмите "Создать подкласс NSManagedObject", он воссоздает для вас класс.

Ответ 4

Вы не должны проверять обе цели для контроллера вида. Вы должны включить только цель проекта для контроллера вида. Вы должны импортировать модуль класса в файл тестового примера, например, @testable импортировать myprojectname вместо включения обеих целей.

Ответ 5

Это может произойти, если класс является членом двух целей (возможно, двух фреймворков?) - и ваше приложение каким-то образом ссылается на одну структуру, в то время как цель unit test ссылается на вторую цель.

Таким образом, один из скомпилированных артефактов имеет полностью квалифицированный тип Framework1.MyClass, а другой - Framework2.MyClass - и это разные классы во время выполнения, потому что у них разные пространства имен. (Хотя оба класса скомпилированы из одного и того же исходного файла Swift)