Java 具有associatedtype协议的数组

Java 具有associatedtype协议的数组,java,swift,swift2,swift-protocols,Java,Swift,Swift2,Swift Protocols,我来自java,学习模式没有什么困难 我有第一个协议 protocol Interval { } 第二点: protocol Event { associatedtype IntervalType: Interval var interval: IntervalType func doSomething(param: IntervalType ) } 如何使用类型Event创建数组 我看了一下类型erase,以及它为创建这样一个结构提供的解决方案: public

我来自java,学习模式没有什么困难

我有第一个协议

protocol Interval
{

}
第二点:

protocol Event
{
    associatedtype IntervalType: Interval

    var interval: IntervalType

    func doSomething(param: IntervalType )
}
如何使用类型Event创建数组

我看了一下类型erase,以及它为创建这样一个结构提供的解决方案:

public struct AnyEvent<intervalType: Interval>: Event {...}
确认可读间隔的两种类型:

class Interval implements ReadableInterval {...}

class MutableInterval implements: ReadableInterval {...}
通用事件接口:

interface ReadableInterval {...}
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>

如您所知,在Swift中,您不能声明具有关联类型的协议数组(请获取更多详细信息)

但是,您可以像这样声明一个新协议

protocol AnyEvent {
    var interval: Interval { get }
    func doSomething(param: Interval )
}
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 )
}
您的3个协议现在应该是这样的

protocol AnyEvent {
    var interval: Interval { get }
    func doSomething(param: Interval )
}
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 )
}
用法 要使用这些协议,我们需要一些符合它们的结构(或类)

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())
}
是水龙头

这是一种姿态

我还想问一下,是否有可能使Event extend equalable并在类型擦除中定义它 是的,您只需要添加声明

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

现在,您正在强制每个结构o类符合
事件
成为
可平等的

您能给我举一个实现事件并确认它的EventClass或EventStruct的例子吗?时间间隔将是一个很好的类型别名IntervalType@4bottiglie现在我没有Mac电脑了。我会给你举个例子tomorrow@4bottiglie当前位置我还没找到办法:)斯威夫特让事情变得非常困难。我发现的唯一解决方案是跳过事件协议,使用一个新变量代替associatedtype,例如Interval的Interval和timeInterval的timeInterval,作为共享相同私有\u timeInterval变量的属性。但是,每一个扩展类都有一个新类是很难看的。