1

在 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];
    }
}

在此示例中,我的代码的使用者实际上并不知道类BirdBat类(或任何其他实现并Animal符合.FlyerrandomFlyingAnimaleatfly

这样的事情在 Swift 中是可能的吗?

4

1 回答 1

0

您可以在 Swift 中应用一些方法,但您可能会定义一个协议AnimalType和一个协议FlyerType——它们之间没有关系:

public protocol AnimalType {}
public protocol FlyerType {
    func fly()
}

然后,创建内部或私有类,如下所示:

internal class Animal: AnimalType {}
internal class Bird: Animal {}
internal class Bat: Animal {}

现在,类通过继承其基类的形式BirdBat符合。为了符合,我们可以扩展 这些类如下:AnimalTypeAnimalFlyerType

extension Bird: FlyerType {
    internal func fly() { print("Bird's flying") }
}

extension Bat: FlyerType {
    internal func fly() { print("Bat's flying") }
}

然后可以按如下方式实现您的工厂功能:

public func randomFlyingAnimal() -> protocol<AnimalType, FlyerType> {
    switch (arc4random() % 2) {
    case 0: return Bird()
    default: return Bat()
    }
}

protocol<AnimalType, FlyerType>是一种协议组合类型——在这种情况下,它的应用似乎很有用。

于 2016-02-04T09:33:02.057 回答