PiecesChoisies
не распознается как тип.Это может произойти, потому что у него есть циклические зависимости.
Следующий пример кода иллюстрирует проблему.Классы A и B создают круговую зависимость, пытаясь импортировать друг друга.
#import "B.h" // <-- A imports B
@interface A : NSObject
@end
#import "A.h"
@implementation A
@end
#import "A.h" // <-- and B imports A
@interface B : NSObject
@end
#import "B.h"
@implementation B
@end
Поскольку классы никогда не создаются, компилятор обрабатывает их как неизвестные токены, поэтому ошибка отображается как Expected specifier-qualifier-list before XXX
.Другими словами «я ожидал чего-то значимого до XXX».
Чтобы удалить циклическую зависимость:
- И добавьте прямое объявление класса (
@class
) в файл интерфейса. - Переместите
#import
из интерфейса в файл реализации.
Объявление класса говорит компилятору "не волнуйтесь, я определю это позже", поэтому заголовок становится безопасным для импорта, поскольку конфликтующее определение теперь не видно в файле реализации.
Вот результат для предыдущего примера:
@class B; // <---- #import "B.h" replaced with @class B
@interface A : NSObject
@end
#import "A.h"
#import "B.h" // <---- #import "B.h" added
@implementation A
@end
И то же самое с классом B:
@class A; // <---- #import "A.h" replaced with @class A
@interface B : NSObject
@end
#import "B.h"
#import "A.h" // <---- #import "A.h" added
@implementation B
@end