gpt4 book ai didi

java - 具有 associatedtype 协议(protocol)的数组

转载 作者:行者123 更新时间:2023-11-28 06:39:41 25 4
gpt4 key购买 nike

我来自 Java,我在学习模式方面没有什么困难。

我有第一个协议(protocol)

protocol Interval
{

}

第二个:

protocol Event
{
associatedtype IntervalType: Interval

var interval: IntervalType

func doSomething(param: IntervalType )
}

如何创建事件类型的数组?

我查看了类型删除及其为创建这样的结构提供的解决方案:

public struct AnyEvent<intervalType: Interval>: Event {...}

但它只让我有可能创建一个包含任何事件类型且只有一种类型的间隔的数组,我想创建一个包含任何类型的事件的数组,这些事件可以包含任何类型的间隔,例如:[AnyEvent][AnyEvent<Interval>]

我还想问一下是否有可能使 Event extend Equatable 并在 type-erase 中定义它。

编辑:

希望有人同时擅长swift和java,并且可以为此提供翻译的模式:

一个简单的通用区间接口(interface):

interface ReadableInterval {...}

确定可读区间的两种:

class Interval implements ReadableInterval {...}

class MutableInterval implements: ReadableInterval {...}

通用事件接口(interface):

interface ReadablEvent
{
ReadableInterval getInterval();
}

两种类型的事件可能具有不同的间隔,具有专门的方法返回类型:

class Event implements: ReadablEvent
{

private Interval interval = new Interval();

Interval getInterval()
{
return interval;
}
}

class MutableEvent implements: ReadablEvent
{

private MutableInterval interval = new MutableInterval();

MutableInterval getInterval()
{
return interval;
}
}

然后我想要一个包含 Event 和 MutableEvent 的列表或数组,例如:

ArrayList<ReadableEvent>

ReadableEvent[]

最佳答案

如您所知,在 Swift 中您不能声明具有关联类型的协议(protocol)数组(请 read this 了解更多详情)

但是你可以像这样声明一个新的协议(protocol)

protocol AnyEvent {
var interval: Interval { get }
func doSomething(param: Interval )
}

您的 3 个协议(protocol)现在应该如下所示

protocol Interval {

}

protocol AnyEvent {
var interval: Interval { get }
func doSomething(param: Interval )
}

protocol Event: AnyEvent {
associatedtype IntervalType: Interval
var interval: IntervalType { get }
func doSomething(param: IntervalType )
}

用法

要使用这些协议(protocol),我们需要一些符合它们的结构(或类)

struct TimeInterval: Interval { }
struct TapEvent: AnyEvent {
var interval: Interval = TimeInterval()
func doSomething(param: Interval) {
print("It's a tap")
}
}
struct GestureEvent: AnyEvent {
var interval: Interval = TimeInterval()
func doSomething(param: Interval) {
print("It's a gesture")
}
}

现在我们可以

var events = [AnyEvent]()
events.append(TapEvent())
events.append(GestureEvent())
for event in events {
event.doSomething(TimeInterval())
}

It's a tap

It's a gesture

我也想问问是否有可能让Event扩展Equatable并在type-erase中定义它

是的,你只需要添加声明

protocol Event: AnyEvent, Equatable {
associatedtype IntervalType: Interval
var interval: IntervalType { get }
func doSomething(param: IntervalType )
}

现在您强制每个符合 Event 的结构或类成为 Equatable

关于java - 具有 associatedtype 协议(protocol)的数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38281800/

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