Мне хорошо известно, что общее практическое правило заключается в том, что вы должны импортировать только то, что необходимо - интерфейсы базовых классов, интерфейсы протоколов и т. Д. - для компиляции класса и использования @class
для все, что может быть заявлено заранее. Однако я столкнулся со следующим сценарием, в котором мне показалось, что #import
было более подходящим решением:
#import "ClassA.h" // Previously, @class ClassA;
#import "ClassB.h" // Previously, @class ClassB;
#import "ClassC.h" // Unnecessary to forward-declare
@interface ClassD : NSObject
@property (nonatomic, retain) ClassA * classAObject;
@property (nonatomic, retain) ClassB * classBObject;
@property (nonatomic, copy) NSArray * classCObjects;
@end
Сначала Я просто объявил пересылку ClassA
и ClassB
(поскольку компоненты classCObjects
относятся к ClassC
только по контракту). Это было моим первоначальным инстинктом.
Но после попытки использовать ClassD
в другом месте я быстро понял, что мне также нужно импортировать ClassA
, ClassB
и ClassC
вместе с ClassD
везде, где я его использовал. Это похоже на то, что другому классу не следует заботиться при использовании ClassD
. Я думал, что, по сути, пользователь ClassD
должен заботиться только об импорте ClassD.h
и предполагать, что он может работать со всем классом без кучи других # операторы import
. Учитывая вышеупомянутый подход, я в основном включил все необходимое для работы в домене ClassD
прямо в его интерфейс.
Есть ли веская причина, по которой этот подход не идеален, за исключением «вы» Включено ли больше, чем абсолютно необходимо для компиляции? "