はい、これは有効なコードです。これは、メソッドを宣言することになります
- (id<ParentProtocol>)delegate;
- (void)setDelegate:(id<ParentProtocol>)delegate;
インターフェイスで同じセレクター (および)Parent
のメソッドを宣言する-delegate
-setDelegate
Child
- (id<ParentProtocol, ChildProtocol>)delegate;
- (void)setDelegate:(id<ParentProtocol, ChildProtocol>)delegate;
id<ParentProtocol>
とid<ParentProtocol, ChildProtocol>
は互換性のある型であるため、これは許容されます (警告は発生しません) 。(これを、 inChild
の宣言delegate
が型であると宣言する状況と比較してくださいNSArray *
。警告が表示されProperty type 'NSArray *' is incompatible with type 'id<ParentProtocol>' inherited from 'Parent'
ます。)
ちなみに、以下のように書くChildProtocol
ことで継承するように定義できることは注目に値します。ParentProtocol
@protocol ParentProtocol <NSObject>
//....
@end
と
@protocol ChildProtocol <ParentProtocol>
//....
@end
これにより、次のインターフェイスに書き込むことができますChild
@property (nonatomic, unsafe_unretained) id<ChildProtocol>;
それよりも
@property (nonatomic, unsafe_unretained) id<ParentProtocol, ChildProtocol>;