具有关联类型协议的数组

时间:2016-07-09 12:28:40

标签: java swift swift2 swift-protocols

我来自java,我很难学习模式。

我有第一个协议

protocol Interval
{

}

第二个:

protocol Event
{
    associatedtype IntervalType: Interval

    var interval: IntervalType

    func doSomething(param: IntervalType )
}

如何使用Event类型创建数组?

我看了一下类型擦除和解决方案,它创建了一个像这样的结构:

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

但它只能让我创建一个包含任何事件类型且只有一种Interval类型的数组,我想创建一个包含任何类型Interval的数组,如:{{1 }或[AnyEvent]

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

修改

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

一个简单的公共间隔界面:

[AnyEvent<Interval>]

确认可读间隔的两种类型:

interface ReadableInterval {...}

常见事件界面:

class Interval implements ReadableInterval {...}

class MutableInterval implements: ReadableInterval {...}

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

interface ReadablEvent
{
   ReadableInterval getInterval();
}

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

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

ArrayList<ReadableEvent>

1 个答案:

答案 0 :(得分:1)

正如您在Swift中所知,您无法声明具有关联类型的协议数组(有关详细信息,请read this

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

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

你的3个协议现在应该是这样的

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())
}
  

这是一个点击

     

这是一个手势

我还想询问是否有可能使事件扩展为Equatable并在type-erase

中定义它

是的,你只需要添加声明

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

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