Тип id <Protocol1> не соответствует идентификатору <Protocol2> - но это так! - PullRequest
3 голосов
/ 21 августа 2009

Хорошо, у меня есть два протокола в одном заголовочном файле, назовем их Protocol1 и Protocol2. У меня есть главный контроллер приложения, который соответствует обоим протоколам, и подкласс NSWindowController, который имеет следующий член:

id <Protocol1, Protocol2> delegate;

В конце реализации моего подкласса NSWindowController я получаю предупреждение о том, что "идентификатор типа не соответствует Protocol2" Но, как показано, делегат должен соответствовать обоим протоколам, что он и делает.

Кроме того, приложение работает отлично. Есть ли другой способ сделать это? Я полагаю, что я мог бы просто сложить два протокола вместе, но это повредило бы модульность программы.

EDIT:

Вот два протокола. Поскольку это скорее тестовый сценарий, они короткие.

@protocol TPTBController <NSObject>

-(void)sendGrowlMessage:(NSString *)message title:(NSString *)title;

@end

@protocol AddPower <NSObject>

-(void)addPower:(NSArray *)array;
-(void)setCanAddPower:(BOOL)can;

@end

Ответы [ 3 ]

3 голосов
/ 23 августа 2009

Спецификация языка не ясна, поддерживает ли id-with-protocol список протоколов или нет. Протоколы могут расширять списки протоколов, но неясно, поддерживает этот синтаксис или нет.

Вы можете создать комбинированный протокол:

@protocol AddPowerAndTPTBController <AddPower, TPTBController>
@end
...
id <AddPowerAndTPTBController> delegate;

Хотя это и не элегантно, это будет работать; но для этого потребуется, чтобы ваш класс делегата соответствовал AddPoewrAndTPTBController, а не только двум индивидуально.

0 голосов
/ 23 августа 2009

Что произойдет, если вы разделите протоколы на отдельные файлы, а затем импортируете их оба в класс NSWindowController?

0 голосов
/ 21 августа 2009

Импортируете ли вы протоколы на свой NSWindowController подкласс?

То, что приложение работает, указывает мне в этом направлении. Похоже, что при статической проверке компилятор не может понять, что ваш класс соответствует протоколам, тогда как при фактической отправке сообщений это происходит успешно (и поэтому приложение работает должным образом)

...