在 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 中是可能的吗?