我来自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>
答案 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())
}
这是一个点击
这是一个手势
是的,你只需要添加声明
protocol Event: AnyEvent, Equatable {
associatedtype IntervalType: Interval
var interval: IntervalType { get }
func doSomething(param: IntervalType )
}
现在,您强制每个符合Event
的结构类都为Equatable
。