问题标签 [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 投票
2 回答
935 浏览

swift - Swift 协议扩展实现另一个具有共享关联类型的协议

考虑以下:

此代码编译。但是如果我注释掉关联类型的显式定义typealias A = String,那么由于某种原因,swiftc 无法推断出类型。

我感觉这与共享相同关联类型但没有通过例如类型参数化(可能关联类型不够强大/不够成熟?)的直接断言的两个协议有关,这使得类型推断模棱两可。

我不确定这是否是语言的错误/不成熟,或者我可能错过了协议扩展中的一些细微差别,这些细微差别理所当然地导致了这种行为。

有人可以对此有所了解吗?

0 投票
0 回答
39 浏览

swift - 协议扩展 - 无法找到匹配的属性

使用这些协议定义:

以及实现它们的类:

我会收到一个错误:

MyPresenter 不符合 Activable 协议

但是,当我将依赖项重新定义为具体类而不是协议时:

一切都是桃色的。如果协议的关联类型被解析为另一个协议而不是具体类型,那么匹配协议扩展似乎存在问题。

所以我想知道:我错过了什么吗?这是一个已知的问题?您知道任何解决方法吗?

0 投票
0 回答
384 浏览

generics - 类型不匹配:预期关联类型找到结构

我有以下示例代码:

这会产生警告(和未来的错误):

我的问题是类型不匹配来自哪里?警告突出显示 的默认值,Item::Manager但指出被破坏的类型要求来自DefaultManager. 如果我删除Item::Manager警告的默认值就会消失,但是我更愿意保留默认值。改变

(但将关联的类型约束留在Managerimpl for上DefaultManager)也会清除警告,但可能不太理想,因为它会允许发生以下情况:

在那种情况下DefaultManager<Foo>不应该是一个有效的类型,因为<Foo as Item>::Manageris FooManager, not DefaultManager<Foo>

导致类型不匹配的原因是什么,我如何向编译器说明满足类型约束?

编辑:为了澄清,我使用了不稳定的associated_type_defaults特性,以便我可以提供一个默认值,Item::Manager所以这个例子现在只建立在 nightly 上。

0 投票
2 回答
97 浏览

swift - 约束关联类型

我的代码的简化版本显示了问题:

我猜测错误的发生是因为编译器无法进入StringToInt并验证它InputOutput确实分别符合InputTypeOutputType

对我来说,解决这个问题的最好方法是直接在协议中约束相关类型。它会更有表现力,编译器也会有更多的信息。但简单地做typealias Input: InputType是行不通的。

有没有办法限制关联类型?

0 投票
2 回答
328 浏览

swift - 通用控制器内的通用 Swift 协议

是否可以在泛型中使用泛型?

我有这个协议

我也有ListViewModel实现这个协议的基础

但是已经在这里它说我ListViewModelProtocol的没有实现。如何将 T 和 U 设置为协议内的特定类?因为如果我在协议中写这个

它仍然无法正常工作。

我的目标是子BaseListViewModel类化

然后我可以在我的BaseViewController

在一些子类ViewController中这样做:

这样CustomViewController会“得到”TestCellViewModelTestTableViewCell(实际上是它的 BaseViewController)。

但是,这当然不像我预期的那样工作。我错过了什么?或者我必须在每个实现它或将它用作泛型类型的类中typealias定义?ListViewModelProtocol这意味着我必须在类和类中定义ViewModeland Cellof ,但这不是那么通用,因为我只想将它们的基类型放在协议中,仅此而已。ListViewModelProtocolBaseListViewModelBaseViewController

或者也许我的方法有问题,我应该以不同的方式实施?

任何建议都是有用的。谢谢

编辑

我已经设法解决了这个问题,但我还有另一个问题。

这个数据源通过调用它自己的方法在 UITableViewDataSource 方法中使用(参见 ListViewModelProtocol 方法)。一切正常,但是当一些自定义控制器:

Controller: BaseViewController<TestListViewModel>

正在取消初始化我收到 EXC_BAD_ACCESS 错误。如果我把

它有效,但我想知道为什么我需要将其设置为零。

谢谢。

0 投票
1 回答
67 浏览

swift - Swift - 约束关联类型时编译错误

所以我不必编写太多代码来复制我的错误——在这种情况下我可能应该使用泛型,但感觉我的解决方案应该可以工作。所以下面的代码块给了我一个“类型 DCServiceClient 不符合协议 DMServiceClient”:

但是,如果我删除对关联类型(端点)的约束,它编译时不会出现任何问题。因为 DCServiceEndpoint 符合约束 (DMServiceEndpoint),所以它似乎应该编译。关于我在这里缺少什么的任何想法?多谢你们!

0 投票
1 回答
59 浏览

generics - 在不指定具体关联类型的情况下对特征边界进行别名

我发现自己在相同的范围内使用参数编写不同的函数,如下所示:

觉得这有点麻烦,我试图给这些界限起别名。但是我没有找到办法。在检查了几个地方[1],[2]之后,我得到的最接近的是:

现在,作为一个例子,这编译得很好:

但是当我尝试使用它时:

我收到以下错误:

所以,没有运气。我该如何前进?


1 https://github.com/rust-lang/rust/issues/8634
2 https://stackoverflow.com/a/30424219/3957040

0 投票
1 回答
322 浏览

swift - Swift 协议类型别名中的默认类型可能吗?

我通常对一种或另一种编程范式的优点充满诗意,但今天我决定直接回答我的问题。所以我来了……</p>

我有 4-5 个类似的结构。在每一个中,前 3 个字段几乎相同。我将这些结构存储在一个数组中。由于每个结构都是它自己的类型,而且由于我已经听到的都是面向通用协议的编程,所以我决定让它们都符合协议。然后我可以像这样轻松地将它们保存在同一个数组中var tables: [DataHoldable]

所以,我知道我需要创建 5 个结构,所有这些都必须共享三个成员:formatlengthlanguage。这是我正在谈论的一个简短示例:

正如你所看到的,TableE它的所有字段都有更宽的整数,并且它的format字段被签名以结束它。

所以,这就是我认为方便的typealias功能可以发挥作用的地方。

我做了一个这样的协议:

我认为通过UInt16为协议的关联类型分配默认类型,我不必UInt16在前 4 个结构中显式声明,从而允许我绕过大量重新键入(双关语)。我在想有可能做这样的事情:

但是,情况似乎并非如此,因为无论我做了什么,我都开始犯错误。我什至创建了协议的扩展,因为我认为可以在扩展中使用默认的关联类型。然而,在这样做的时候,我引入了新的更可怕的错误。

我已经尝试了大约 10 种不同的组合和/或黑客和/或诡计,但似乎没有任何效果。

所以我的问题是:如果实际上不能使代码通用化,那么能够“通用化”代码又有什么意义呢?我错过了什么吗?任何帮助、想法、想法、可能的路线等将不胜感激。谢谢!

0 投票
1 回答
100 浏览

generics - 使用泛型时是否可以使用自引用关联类型?

示例:给定以下特征,

我希望每当一个类型的值与返回V另一个类型的值相同类型的值时V。每当将一个类型的值E添加到另一个相同类型的值时,我都希望E返回另一个值。

天真地,我认为这可能是正确的方向,

但这只是在黑暗中拍摄的。

Add提供以下示例的文档,

但我无法理解如何以同样的方式为泛型类型提供实现,如果这是可能的话。

0 投票
1 回答
349 浏览

ios - Swift ViewModel 与 UITableViewCell 的关联类型

我有以下协议和 ViewModel

此设置允许我将 ViewModel 绑定到 TableViewCell 类。但我苦苦挣扎的地方是绑定本身:

到目前为止我想出的唯一解决方法是使用动态调度(performSelector),我想知道是否有一种方法可以直接调用该方法而不使用运行时。