Ответ на ваш вопрос заключается в том, чтобы либо импортировать заголовочный файл typedef, либо использовать универсальный тип, такой как NSInteger, вместо типа enum.
Однако есть больше причин не импортировать файл заголовка, чем просто скорость компиляции.
Отсутствие импорта заголовочного файла также уменьшает ваш непреднамеренный доступ к посторонним классам.
Например, допустим, у вас есть класс TrackFileChanges, который отслеживает файловую систему на предмет изменений в конкретном файле, и у вас есть класс CachedFile, в котором хранятся кэшированные данные из файла. Последний может использовать частный ivar типа TrackFileChanges *, но для использования CachedFile это просто деталь реализации (в идеале, ivar должен автоматически генерироваться с частным свойством с использованием новой среды выполнения, но это невозможно, если вы использовать старое время выполнения).
Таким образом, клиенты, которые #import "CachedFile.h", вероятно, не нуждаются или не хотят иметь доступ к TrackFileChanges.h. И если они это сделают, они должны прояснить это, импортируя это сами. Используя @class TrackFileChanges вместо #import "TrackFileChanges.h" в CachedFile.h, вы улучшаете инкапсуляцию.
Но все это говорит о том, что нет ничего плохого в том, чтобы импортировать файл заголовка из второго файла заголовка, если второй заголовок хочет предоставить первый всем клиентам. Например, файлы заголовков, которые объявляют классы, необходимо импортировать непосредственно в файлы заголовков подклассов, а файлы заголовков, объявляющие протоколы, вполне можно импортировать напрямую (хотя вы можете использовать @protocol ABC; во избежание этого).