【发布时间】:2016-02-04 07:27:32
【问题描述】:
在 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 中是可能的吗?
【问题讨论】:
-
问得好问题,但您可以在操场上通过最少的代码转换简单地尝试...
-
我已经修改了我的问题,以便更清楚我的实际意图。我知道在 Swift 中,如果我要公开定义一个派生自 Animal 并符合 Flyer 的类,我可以返回任何该类型的私有子类。但是,如果不存在实现 Animal 并符合 Flyer 的公共类型,我不确定方法的签名是什么。
标签: swift inheritance swift-protocols