问题标签 [associated-types]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
swift - 具有泛型类型的协议函数
我想创建一个如下协议:
我想让解析器返回特定类型的结果或另一个解析器。
如果我在 上使用关联类型Parser
,那么我不能Parser
在enum
. 如果我在函数上指定了泛型类型parse()
,那么如果没有泛型类型,我就无法在实现中定义它。
我怎样才能做到这一点?
使用泛型,我可以写这样的东西:
这样, aParser
将由结果类型参数化。parse()
可以返回该Result
类型的结果,或任何类型的解析器,该解析器将输出该Result
类型的结果,或由相同Result
类型参数化的另一个解析器。
然而,据我所知,对于关联类型,我总是有一个Self
约束:
在这种情况下,我不能再有任何类型的解析器返回相同的Result
类型,它必须是相同类型的解析器。
我希望使用Parser
协议获得与使用泛型定义相同的行为,并且我希望能够在类型系统的范围内做到这一点,而无需引入新的盒装类型,就像我可以使用普通定义一样通用定义。
在我看来,在协议associatedtype OutcomeParser: Parser
内部定义,然后返回由该类型参数化的可以解决问题,但如果我尝试以这种方式定义,我会收到错误:Parser
enum
OutcomeParser
类型可能不会将自身作为要求引用
ios - Swift:使用泛型关联类型段错误编译器的实例
当我尝试编译以下代码时出现分段错误。我正在尝试对CellUpdater
结构进行类型约束扩展,它访问一个属性,该属性的类型是在泛型类型的关联类型上定义的。不确定我是否做错了什么,或者它是否是 Swift 编译器的限制,有什么想法吗?
haskell - 关联类型族失败,独立时工作
当我有如下代码时:
我收到错误(带有 GHC 头):
大概这是因为(t a b)
它不像错误暗示的那样是一个简单的变量。
但我可以简单地重组代码,如下所示:
然后现在一切似乎都运行良好。
因为语法稍微混乱,我是否会因为从类中取出类型族定义而失去任何东西,或者类内定义只是语法糖,所以将它们取出是一种相对免费的解决方法?
swift - 具有通用功能和关联类型的协议
我有以下代码:
现在,问题Something
在于next
. 我想返回Something<U>
而不是Something<Value>
.
但是当我这样做时,我得到了以下错误。
swift - Swift Self 作为绑定在协议中的关联类型
我想强制关联类型为Self
,但编译器没有它。
这是我想要编译的内容:
你可能会问,为什么不直接使用Self
而不是关联类型呢?仅仅因为我不能:关联的类型是从父协议继承的。在父协议中改变它是没有意义的。
这与我正在尝试做的事情类似:
编辑:
马特的答案几乎就是我要找的。它的行为就像我在运行时想要的那样,但在编译时限制不够。
我希望这是不可能的:
我想触发重新声明错误或类似错误typealias
。Class
swift - 当协议具有关联类型时,从常规方法调用协议默认实现
我有一个协议,它有一个带有默认参数的静态方法。我想更改实现协议的类中的默认值。本质上是在做类和超级容易做的事情。
当协议没有关联类型时,我只有一个解决方案。
以下代码有效,但一旦您取消注释关联的类型声明,它就不会编译。
我明白为什么它不能编译:Protocol
没有具体的类型AssociatedType
。
所以也许这个问题应该是“我可以明确地专门化一个协议吗?”,我相信答案是否定的。
我有一个部分解决方法。但即使它有效,它也很糟糕。
尤其是当您考虑我正在编写一个sayHello
公开的库时,因此以下解决方法迫使我拥有第二个协议,该协议必须是公开的,但没有用。
这是解决方法:
但这对我不起作用,因为我sayHello
使用关联类型。所以它不能被提取到另一个协议。
只是为了确保我清楚,这就是我想要的,只是用类代替协议:
swift - 约束协议中继承的关联类型
我想定义一个 Swift 协议,它也是一个序列,其元素符合另一个特定协议。理想情况下,我想写这样的东西:
不幸的是,Swift 目前不允许在协议定义中使用 where 子句(而且它也不允许使用具有关联类型的协议作为类型约束)。有什么办法我仍然可以做到这一点?容器(理想情况下是 A)应该能够有不同的支持实现。
编辑:我知道我可以将序列移动到 Container 的类型擦除属性,这将以引入不必要的词法开销为代价解决所有问题。不过,我对一种不会“欺骗”出类型系统的解决方案感兴趣。
generics - 通过关联类型返回泛型类型
我试图完成一些更通用的事情,但在尝试使用关联类型时失败了。Given 是一个Shape
特征和一个Renderer
类型,它试图返回Builder
一个特定类型的形状。
形状
建设者
渲染器
我想要实现的是该set_shape
方法将返回RectangleBuilder
如果给定shape
的类型Rectangle
swift - 使类扩展符合通用协议功能
* 精简版 *
如何使类(扩展)符合通用协议函数?
* 长版 *
这是支持分页集合的数据结构的一小部分,
这是具有“真实”案例的协议的实现:
得到如下错误(1):
类型“人”不符合协议“页面”
协议需要嵌套类型“PageItemType”
我也试过让它明确,但我得到了一个不同的错误:
得到如下错误(2):
无法将“Person”类型的返回表达式转换为“PageItemType”类型
所以:*如何让itemAt
函数返回 PageItemType 类型别名的有效类型?
* 奖金 *
价值 50 的奖励问题(如果答案超过一行,我将打开一个新问题):参考第一个代码片段PagedCollection
- 假设每个 Page 实现总是有一个已知的 Pageable 协议对象类型的实现
- 有没有办法避免声明
ItemType:Pageable
?或者至少用一个where
条款来强制执行它?