Быстрая компиляция ошибки "Неизвестное имя типа" и "Ожидаемый тип"

Я столкнулся с проблемой, когда мой код 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.