Неизвестное имя типа для быстрого свойства
У меня есть класс CustomViewController, написанный в swift и класс CustomNavigationController, написанный в Objective C. Я пытаюсь добавить свой CustomNavigationController в качестве свойства для своего CustomViewController. Я добавил #import "CustomNavigationController.h"
в мой заголовок.
В моем CustomViewController у меня есть:
class CustomViewController: UIViewController {
var navController: CustomNavigationController?
...
//init methods
...
override func viewDidLoad() {
super.viewDidLoad()
//Set up Navigation Controller
navController = self.storyboard.instantiateViewControllerWithIdentifier("CustomNavigationController") as CustomNavigationController!
}
Нет ошибок до тех пор, пока я не попытаюсь создать и запустить... Я получаю "неизвестное имя типа" CustomNavigationController ", вы имели в виду" UINavigationController "?"
Кто-нибудь знает, почему он не распознает тип?
Ответы
Ответ 1
В коде Objective-C вы импортируете автоматически созданный заголовок -Swift.h
. В этом же коде перед строкой #import
введите #import "CustomNavigationController.h"
. Порядок этих двух #import
утверждений имеет решающее значение!
Это решит проблему, убедившись, что CustomNavigationController находится в пространстве имен перед автоматически созданным заголовком -Swift.h
, и поэтому последний будет знать о первом, и все будет хорошо.
Это что-то неприятное, если этому классу Objective-C не нужно было знать о CustomNavigationController, но он решает проблему в будущем и позволяет продолжить работу с вашим гибридным проектом.
Ответ 2
Похоже, что сгенерированный заголовочный файл ProjectName-Swift.h
не включает в себя содержимое ProjectName-Bridging-Header.h
. Это приводит к тому, что любые типы, которые еще не были объявлены перед импортом ProjectName-Swift.h
, вызывают ошибку Unknown type name
в компиляторе. Это похоже на ошибку.
Мое обходное решение состояло в том, чтобы создать альтернативную версию ProjectName-Swift.h
, которая отправляет объявления, вызывающие ошибки, а затем импортирует ProjectName-Swifth.h
. Я назвал его ProjectName-Swift-Fixed.h
. Для меня ProjectName-Swift-Fixed.h
выглядел следующим образом:
// ProjectName-Swift-Fixed.h
@class CustomViewController;
#import "ProjectName-Swift.h"
Тогда всюду в коде, где я имел #include "ProjectName-Swift.h"
, я заменил его на #include "ProjectName-Swift-Fixed.h"
Ответ 3
В случае, если вы не можете исправить проблему, изменив порядок операторов #import
, как это было предложено в приведенных выше ответах, проверка файлов в вашем ProjectName-Bridging-Header.h
для отсутствия импорта инфраструктуры может работать.
В моем случае у меня был класс в заголовочном файле с мостом, который использовал UIImage
в одном из его методов. Когда мой проект состоял только из Objective-C, который работал нормально, но при экспонировании этого заголовка в Swift мне пришлось добавить #import <UIKit/UIKit.h>
, чтобы удалить ошибку.
Ответ 4
Попробуйте следующее:
navController = self.storyboard.instantiateViewControllerWithIdentifier("CustomNavigationController") as? CustomNavigationController
Ответ 5
Я столкнулся с такой же ситуацией. В моем случае ошибки были устранены после обновления быстрой версии до 3.0 в всех целей с помощью команды "Редактировать" > "Преобразовать" > "Текущий синтаксис". Надеюсь, что это поможет.