Заявить о соответствии протокола в целевом объявлении протокола c. - PullRequest
0 голосов
/ 18 июня 2020

Предположим, что класс был определен следующим образом в OriginalObject.h:

@protocol OriginalDelegate;

@interface OriginalObject : NSObject  {}
@property (nullable, nonatomic, weak) id<OriginalDelegate> delegate;
@end

@protocol OriginalDelegate <NSObject>
// … delegate method declarations …
@end

Теперь, в ExtendedObject.h, я хочу сделать это:

#import "OriginalObject.h"

@protocol ExtendedDelegate;

@interface ExtendedObject : OriginalObject {}
@property (nullable, nonatomic, weak) id<ExtendedDelegate> delegate;
@end

@protocol ExtendedDelegate <OriginalDelegate>
// … additional delegate method declarations …
@end

Попытка дать мне следующее предупреждение в строке @property … delegate; из ExtendedObject.h:

Property type 'id<ExtendedDelegate> _Nullable' is incompatible with type 'id<OriginalDelegate> _Nullable' inherited from 'OriginalObject'

Похоже, что компилятор не знает, что ExtendedDelegate будет соответствовать OriginalDelegate. Перемещение полного объявления протокола над интерфейсом ExtendedObject в ExtendedObject.h устраняет предупреждение:

#import "OriginalObject.h"

@protocol ExtendedDelegate <OriginalDelegate>
// … additional delegate method declarations …
@end

@interface ExtendedObject : OriginalObject {}
@property (nullable, nonatomic, weak) id<ExtendedDelegate> delegate;
@end

Я хотел бы знать ... есть ли способ сообщить компилятору в предварительном объявлении , что ExtendedDelegate будет соответствовать OriginalDelegate (что позволяет использовать что-то более похожее на первую версию ExtendedObject.h выше)?


Ни один из следующие попытки такого прямого объявления кажутся допустимым синтаксисом:

@protocol ExtendedDelegate <OriginalDelegate>;
@protocol ExtendedDelegate : OriginalDelegate;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...