Прямое объявление для классов, вызываемых в аргументах метода определения протокола - PullRequest
0 голосов
/ 03 октября 2018

Форвардные объявления используются для уменьшения зависимостей и предотвращения ненужного импорта, когда задействованы несколько заголовочных файлов.

Как говорится, как мне поступить в этом сценарии?

Допустим, у меня естьследующие:

ClassAlpha.h

@interface ClassAlpha: NSObject

-(void)helloWorld;

@end

ProtocolA.h

@protocol ProtocolA <NSObject>

-(void)doSomethingWithAlpha:(ClassAlpha *__Nonnull)alpha;

@end

ClassBeta.h(соответствует ProtocolA)

@interface ClassBeta: NSObject<ProtocolA>

@end

ClassBeta.m

#import "ClassAlpha.h"

@implementation ClassBeta

-(void)doSomethingWithAlpha:(ClassAlpha *)alpha
{
    NSLog(@"Hello");
}
@end

В ProtocolA.h, я должен использовать предварительное объявление ClassAlpha?Однако, если бы я сделал это, это означало бы, что ClassBeta должна была бы быть той, которая импортирует ClassAlpha в его реализации наряду с импортом ProtocolA.В качестве альтернативы, если бы я использовал оператор импорта ClassAlpha в ProtocolA, нет необходимости говорить, что ClassBeta не должен был бы это делать.Какова будет лучшая практика для этой ситуации?

1 Ответ

0 голосов
/ 24 октября 2018

Вы должны избегать #import в заголовках, насколько это возможно.Итак, да, вы должны использовать предварительное объявление ClassAlpha (то есть @class ClassAlpha;) в PrototolA.h, потому что для использования ClassAlpha * в качестве типа в объявлении параметра все, что вам нужно знать, это то, что ClassAlphaназвание класса.Вам не нужно больше ничего знать о том, как это объявлено.Да, вы должны импортировать ClassAlpha.h в ClassBeta.m;вы должны выполнять импорт в файлах реализации как можно больше вместо файлов заголовков.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...