问题标签 [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.

0 投票
1 回答
1102 浏览

swift - 具有相同关联类型名称的协议

如果我有两个协议,其关联类型恰好相同,例如

然后我想要一个类来读取整数并将字符串写入:

但编译器抱怨并建议更改StringInt. 理想情况下,应该推断类型,或者如果我明确声明至少可以编译

ReadWrite。有什么解决办法吗?

更新

受此问题启发的解决方法是创建两个辅助协议

并让类从这两个继承:

这似乎可以编译,但我担心这种方式会出现任何问题。

再次更新

我在 Swift 的问题跟踪器中发现了这个问题。任何需要这个缺失功能​​的人(比如我)都应该投票给它。作为比较,这种模式在Rust中是可能的,它也支持关联类型(尽管这不是惯用的用法)。

0 投票
3 回答
6819 浏览

swift - 具有泛型类型的协议函数

我想创建一个如下协议:

我想让解析器返回特定类型的结果或另一个解析器。

如果我在 上使用关联类型Parser,那么我不能Parserenum. 如果我在函数上指定了泛型类型parse(),那么如果没有泛型类型,我就无法在实现中定义它。

我怎样才能做到这一点?


使用泛型,我可以写这样的东西:

这样, aParser将由结果类型参数化。parse()可以返回该Result类型的结果,或任何类型的解析器,该解析器将输出该Result类型的结果,或由相同Result类型参数化的另一个解析器。

然而,据我所知,对于关联类型,我总是有一个Self约束:

在这种情况下,我不能再有任何类型的解析器返回相同的Result类型,它必须是相同类型的解析器。

我希望使用Parser协议获得与使用泛型定义相同的行为,并且我希望能够在类型系统的范围内做到这一点,而无需引入新的盒装类型,就像我可以使用普通定义一样通用定义。

在我看来,在协议associatedtype OutcomeParser: Parser内部定义,然后返回由该类型参数化的可以解决问题,但如果我尝试以这种方式定义,我会收到错误:ParserenumOutcomeParser

类型可能不会将自身作为要求引用

0 投票
1 回答
278 浏览

ios - Swift:使用泛型关联类型段错误编译器的实例

当我尝试编译以下代码时出现分段错误。我正在尝试对CellUpdater结构进行类型约束扩展,它访问一个属性,该属性的类型是在泛型类型的关联类型上定义的。不确定我是否做错了什么,或者它是否是 Swift 编译器的限制,有什么想法吗?

0 投票
1 回答
44 浏览

haskell - 关联类型族失败,独立时工作

当我有如下代码时:

我收到错误(带有 GHC 头):

大概这是因为(t a b)它不像错误暗示的那样是一个简单的变量。

但我可以简单地重组代码,如下所示:

然后现在一切似乎都运行良好。

因为语法稍微混乱,我是否会因为从类中取出类型族定义而失去任何东西,或者类内定义只是语法糖,所以将它们取出是一种相对免费的解决方法?

0 投票
1 回答
463 浏览

swift - 具有通用功能和关联类型的协议

我有以下代码:

现在,问题Something在于next. 我想返回Something<U>而不是Something<Value>.

但是当我这样做时,我得到了以下错误。

0 投票
2 回答
1639 浏览

swift - Swift Self 作为绑定在协议中的关联类型

我想强制关联类型为Self,但编译器没有它。
这是我想要编译的内容:

你可能会问,为什么不直接使用Self而不是关联类型呢?仅仅因为我不能:关联的类型是从父协议继承的。在父协议中改变它是没有意义的。
这与我正在尝试做的事情类似:

编辑:
马特的答案几乎就是我要找的。它的行为就像我在运行时想要的那样,但在编译时限制不够。
我希望这是不可能的:

我想触发重新声明错误或类似错误typealiasClass

0 投票
2 回答
885 浏览

swift - 当协议具有关联类型时,从常规方法调用协议默认实现

我有一个协议,它有一个带有默认参数的静态方法。我想更改实现协议的类中的默认值。本质上是在做类和超级容易做的事情。
当协议没有关联类型时,我只有一个解决方案。

以下代码有效,但一旦您取消注释关联的类型声明,它就不会编译。

我明白为什么它不能编译:Protocol没有具体的类型AssociatedType
所以也许这个问题应该是“我可以明确地专门化一个协议吗?”,我相信答案是否定的。

我有一个部分解决方法。但即使它有效,它也很糟糕。
尤其是当您考虑我正在编写一个sayHello公开的库时,因此以下解决方法迫使我拥有第二个协议,该协议必须是公开的,但没有用。
这是解决方法:

但这对我不起作用,因为我sayHello使用关联类型。所以它不能被提取到另一个协议。

只是为了确保我清楚,这就是我想要的,只是用类代替协议:

0 投票
0 回答
137 浏览

swift - 约束协议中继承的关联类型

我想定义一个 Swift 协议,它也是一个序列,其元素符合另一个特定协议。理想情况下,我想写这样的东西:

不幸的是,Swift 目前不允许在协议定义中使用 where 子句(而且它也不允许使用具有关联类型的协议作为类型约束)。有什么办法我仍然可以做到这一点?容器(理想情况下是 A)应该能够有不同的支持实现。

编辑:我知道我可以将序列移动到 Container 的类型擦除属性,这将以引入不必要的词法开销为代价解决所有问题。不过,我对一种不会“欺骗”出类型系统的解决方案感兴趣。

0 投票
1 回答
1191 浏览

generics - 通过关联类型返回泛型类型

我试图完成一些更通用的事情,但在尝试使用关联类型时失败了。Given 是一个Shape特征和一个Renderer类型,它试图返回Builder一个特定类型的形状。

形状

建设者

渲染器

我想要实现的是该set_shape方法将返回RectangleBuilder 如果给定shape的类型Rectangle

0 投票
2 回答
1814 浏览

swift - 使类扩展符合通用协议功能

* 精简版 *

如何使类(扩展)符合通用协议函数?

* 长版 *

这是支持分页集合的数据结构的一小部分,

这是具有“真实”案例的协议的实现:

得到如下错误(1):

类型“人”不符合协议“页面”

协议需要嵌套类型“PageItemType”

我也试过让它明确,但我得到了一个不同的错误:

得到如下错误(2):

无法将“Person”类型的返回表达式转换为“PageItemType”类型

所以:*如何让itemAt函数返回 PageItemType 类型别名的有效类型?

* 奖金 *

价值 50 的奖励问题(如果答案超过一行,我将打开一个新问题):参考第一个代码片段PagedCollection

  • 假设每个 Page 实现总是有一个已知的 Pageable 协议对象类型的实现
  • 有没有办法避免声明ItemType:Pageable?或者至少用一个where条款来强制执行它?