- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我来自 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
是的,你只需要添加声明
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/
我一直在努力寻找在另一个关联类型中使用泛型和关联类型来解决上述问题的解决方案 案例 我想要一个ObjectRequestType,它里面有一个关联类型ObjectResponseType。 proto
这个问题在这里已经有了答案: Unable to use protocol as associatedtype in another protocol in Swift (2 个答案) Protoc
我一直在为这个问题苦苦思索 我正在尝试在 Swift 上创建一个绑定(bind)结构,以一种简单的方式绑定(bind) viewModel 和 Controller 。所以我创建了一个协议(proto
我正在尝试为我的 tableviewcells 设计一个面向协议(protocol)的 MVVM。我有很多。 我的 viewModel protocol PlainTableViewCellModel
这个问题在这里已经有了答案: Unable to use protocol as associatedtype in another protocol in Swift (2 个答案) 关闭 4 年
假设我有一个协议(protocol): protocol Router { associatedtype Answer typealias AnswerCallback = (Answ
在 swift 协议(protocol)中使用 generic with function 或使用 associatedType 有什么区别? protocol Repository { as
我来自 Java,我在学习模式方面没有什么困难。 我有第一个协议(protocol) protocol Interval { } 第二个: protocol Event { associate
我在使用关联类型作为协议(protocol)时遇到问题: protocol Searchable{ func matches(text: String) -> Bool } protoc
我有一个非常具体的问题,我无法通过 SO 上的给定答案解决这个问题。为了简化这个问题,我删除了所有不需要的东西。此代码仅显示理解问题所需的一切: 所以我有一个看起来像这样的类: class DataS
在设计 API 时,我在每个角落都会遇到这个问题: Protocol can only be used as a generic constraint because it has Self or a
所以这里我有这个协议(protocol) public protocol UseCase { associatedtype ResponseType associatedtype Pa
我正在使用一个库,它定义了两个协议(protocol),A 和 B,每个协议(protocol)都有它的 associatedtype T,像这样: protocol A { associat
这个有效: protocol Inconceivable { associatedtype AbstractType func say(it: AbstractType) } clas
我有一个协议(protocol) RequestType,它有如下所示的 associatedType 模型。 public protocol RequestType: class { ass
我正在尝试使用 MVVM 向 iOS 应用程序添加一些基类,以使其更容易并强制执行公共(public)类关系。 遗憾的是,我遇到了以下问题: error: MyPlayground.playgroun
这个问题在这里已经有了答案: Protocol doesn't conform to itself? (3 个答案) 关闭 3 年前。 我有以下代码: protocol User { var
我有一个小问题,我找不到一种优雅的方法来使用具有关联类型的闭包作为协议(protocol)中的 Void。 假设我有以下协议(protocol): protocol MyProtocol { as
当我在 Playground xcode 9.2 上运行时,苹果文档代码中出现上述错误 https://developer.apple.com/library/content/documentatio
我是一名优秀的程序员,十分优秀!