Предположим, что класс был определен следующим образом в 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;