Java 具有associatedtype协议的数组
我来自java,学习模式没有什么困难 我有第一个协议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
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变量的属性。但是,每一个扩展类都有一个新类是很难看的。