Быстрая компиляция ошибки "Неизвестное имя типа" и "Ожидаемый тип"
Я столкнулся с проблемой, когда мой код Swift компилируется отлично, но тогда сгенерированный файл -Swift.h имеет ошибку в нем...
Вот пример того, что я делаю:
class MyScene : CCLayer {
var ctrl : CCControlSlider?
}
Это компилируется очень просто в быстром коде, и я также вижу методы на объекте ctrl. В моем заголовке моста есть следующее:
#import "cocos2d.h"
#import "CCControlSlider.h"
Это отлично работает в других классах, которые используют другие библиотеки, которые работают правильно. Также обратите внимание, что я могу использовать этот класс CCControlSlider в своих классах objective-c без каких-либо проблем.
Вот что происходит в сгенерированном файле -Swift.h:
SWIFT_CLASS("_TtC15MyProject10MyScene")
@interface MyScene : CCLayer
@property (nonatomic) CCControlSlider * ctrl;
@end
Свойство имеет ошибку "Неизвестное имя типа" CCControlSlider ", и если оно используется в методе, то оно дает ошибку" Ожидаемый тип ".
Это отлично работает с использованием других классов, но по какой-то причине этот один класс передает эту ошибку компилятора только в сгенерированный заголовочный файл и только при использовании из Swift.
Я думаю, что мне интересно, я что-то делаю неправильно или это просто ошибка?
Ответы
Ответ 1
Ответ здесь простейший: fooobar.com/questions/412913/...
В основном, где-то в вашем коде Objective-C вы импортируете автоматически сгенерированный заголовок -Swift.h
. В этом же коде перед строкой #import
введите #import "CCControlSlider.h"
. Порядок этих двух #import
утверждений имеет решающее значение!
Тот факт, что этот класс Objective-C может не понадобиться CCControlSlider не имеет значения (хотя, если это так, то бонус). Главное - порядок. Мы хотим предоставить пространство имен в CCControlSlider перед тем, как подвергнуть пространство имен автоматически генерируемому заголовку -Swift.h
.
Ответ 2
При включении набора файлов Objective C в мой проект, основанный на Swift, я внезапно начал получать от них много ошибок. Тогда я понял, что файл имел:
#import <Foundation/Foundation.h>
У него не было:
#import <UIKit/UIKit.h>
и как только я добавил эту строку, ошибки начали разрешаться. Уход после этого всегда помогает. Удачи.
ПРИМЕЧАНИЕ. С более новыми версиями импорта Swift гораздо проще печатать и делать так:
import UIKit
Ответ 3
Если вы не хотите беспокоиться о порядке импорта во всем мире, вы импортируете свой файл ProjectName-Swift.h
, попробуйте следующее:
Создайте файл с именем ProjectName-Swift-Fixed.h
со следующим содержимым
// ProjectName-Swift-Fixed.h
@class CCControlSlider;
// (Add other imports or forward declarations here)
#import "ProjectName-Swift.h"
Во-вторых, во всей остальной части вашей кодовой базы замените #import "ProjectName-Swift.h"
на #import "ProjectName-Swift-Fixed.h"
Этот подход имеет два преимущества перед копированием и вставкой списка инструкций #import
выше каждого места, где вы используете классы Swift в коде Objective-C:
- Вам не придется беспокоиться о порядке импорта, кроме файла
ProjectName-Swift-Fixed.h
- Когда вы добавляете новые классы Objective-C к вашему SWIFT-коду, вам не нужно добавлять новые инструкции
#import
в каждый Objective-C файл, который использует код Swift
Ответ 4
OC-код имеет глобальный вызов # import "projectName - swift. H" и "projectName - Bridging - Header. H" и вызывает код OC. Это эквивалентно подклассам вызова класса родительского класса, подклассам и вызовам суперкласса. Чтобы сделать "projectName - Bridging - Header. H" вызывает класс oc, не вызывайте # import "projectName - swift. H.