Objective-C では、関数は、パブリック クラスとパブリック プロトコルを実装するプライベート型のインスタンスを、そのプロトコルに準拠するパブリック クラスを定義しなくても返すことができます。
たとえば、次のヘッダー ファイルがあるとします。
@protocol Flyer <NSObject>
-(void) fly;
@end
@interface Animal : NSObject
-(void) eat;
@end
Animal<Flyer> * randomFlyingAnimal();
そして、この実装ファイル:
@implementation Animal
-(void) eat {
NSLog(@"I'm eating");
}
@end
@interface Bird : Animal<Flyer>
@end
@implementation Bird
-(void) fly {
NSLog(@"I'm a flying bird");
}
@end
@interface Bat : Animal<Flyer>
@end
@implementation Bat
-(void) fly {
NSLog(@"I'm a flying bat");
}
@end
Animal<Flyer> * randomFlyingAnimal() {
switch (arc4random() % 2) {
case 0:
return [[Bird alloc] init];
case 1:
default:
return [[Bat alloc] init];
}
}
Bird
この例では、私のコードのコンシューマーは、クラスまたはクラス (または を実装して準拠するBat
他の型)について実際には決して知りませんが、返されるオブジェクトが と の両方を実行できることを確認できます。Animal
Flyer
randomFlyingAnimal
eat
fly
そのようなことはSwiftで可能ですか?