gpt4 book ai didi

Swift:我可以返回实现公共(public)类并符合公共(public)协议(protocol)的私有(private)类型吗?

转载 作者:行者123 更新时间:2023-11-28 08:46:25 26 4
gpt4 key购买 nike

在 Objective-C 中,函数能够返回实现公共(public)类和公共(public)协议(protocol)的私有(private)类型的实例,而无需定义符合该协议(protocol)的公共(public)类。

例如假设我有这个头文件:

@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 中应用一些方法,但您可能会定义一个协议(protocol) AnimalType和协议(protocol) FlyerType - 彼此没有关系:

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

然后,创建内部或私有(private)类如下:

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

现在,上课 BirdBat符合 AnimalType通过继承其基类Animal .为了符合FlyerType我们也可以扩展这些类如下:

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>protocol composition type - 在这种情况下,其应用程序似乎很有用。

关于Swift:我可以返回实现公共(public)类并符合公共(public)协议(protocol)的私有(private)类型吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35194952/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com