问题标签 [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 - Swift 协议扩展实现另一个具有共享关联类型的协议
考虑以下:
此代码编译。但是如果我注释掉关联类型的显式定义typealias A = String
,那么由于某种原因,swiftc 无法推断出类型。
我感觉这与共享相同关联类型但没有通过例如类型参数化(可能关联类型不够强大/不够成熟?)的直接断言的两个协议有关,这使得类型推断模棱两可。
我不确定这是否是语言的错误/不成熟,或者我可能错过了协议扩展中的一些细微差别,这些细微差别理所当然地导致了这种行为。
有人可以对此有所了解吗?
swift - 协议扩展 - 无法找到匹配的属性
使用这些协议定义:
以及实现它们的类:
我会收到一个错误:
MyPresenter 不符合 Activable 协议
但是,当我将依赖项重新定义为具体类而不是协议时:
一切都是桃色的。如果协议的关联类型被解析为另一个协议而不是具体类型,那么匹配协议扩展似乎存在问题。
所以我想知道:我错过了什么吗?这是一个已知的问题?您知道任何解决方法吗?
generics - 类型不匹配:预期关联类型找到结构
我有以下示例代码:
这会产生警告(和未来的错误):
我的问题是类型不匹配来自哪里?警告突出显示 的默认值,Item::Manager
但指出被破坏的类型要求来自DefaultManager
. 如果我删除Item::Manager
警告的默认值就会消失,但是我更愿意保留默认值。改变
至
(但将关联的类型约束留在Manager
impl for上DefaultManager
)也会清除警告,但可能不太理想,因为它会允许发生以下情况:
在那种情况下DefaultManager<Foo>
不应该是一个有效的类型,因为<Foo as Item>::Manager
is FooManager
, not DefaultManager<Foo>
。
导致类型不匹配的原因是什么,我如何向编译器说明满足类型约束?
编辑:为了澄清,我使用了不稳定的associated_type_defaults
特性,以便我可以提供一个默认值,Item::Manager
所以这个例子现在只建立在 nightly 上。
swift - 约束关联类型
我的代码的简化版本显示了问题:
我猜测错误的发生是因为编译器无法进入StringToInt
并验证它Input
并Output
确实分别符合InputType
和OutputType
。
对我来说,解决这个问题的最好方法是直接在协议中约束相关类型。它会更有表现力,编译器也会有更多的信息。但简单地做typealias Input: InputType
是行不通的。
有没有办法限制关联类型?
swift - 通用控制器内的通用 Swift 协议
是否可以在泛型中使用泛型?
我有这个协议
我也有ListViewModel
实现这个协议的基础
但是已经在这里它说我ListViewModelProtocol
的没有实现。如何将 T 和 U 设置为协议内的特定类?因为如果我在协议中写这个
它仍然无法正常工作。
我的目标是子BaseListViewModel
类化
然后我可以在我的BaseViewController
在一些子类ViewController
中这样做:
这样CustomViewController
会“得到”TestCellViewModel
和TestTableViewCell
(实际上是它的 BaseViewController)。
但是,这当然不像我预期的那样工作。我错过了什么?或者我必须在每个实现它或将它用作泛型类型的类中typealias
定义?ListViewModelProtocol
这意味着我必须在类和类中定义ViewModel
and Cell
of ,但这不是那么通用,因为我只想将它们的基类型放在协议中,仅此而已。ListViewModelProtocol
BaseListViewModel
BaseViewController
或者也许我的方法有问题,我应该以不同的方式实施?
任何建议都是有用的。谢谢
编辑
我已经设法解决了这个问题,但我还有另一个问题。
这个数据源通过调用它自己的方法在 UITableViewDataSource 方法中使用(参见 ListViewModelProtocol 方法)。一切正常,但是当一些自定义控制器:
Controller: BaseViewController<TestListViewModel>
正在取消初始化我收到 EXC_BAD_ACCESS 错误。如果我把
它有效,但我想知道为什么我需要将其设置为零。
谢谢。
swift - Swift - 约束关联类型时编译错误
所以我不必编写太多代码来复制我的错误——在这种情况下我可能应该使用泛型,但感觉我的解决方案应该可以工作。所以下面的代码块给了我一个“类型 DCServiceClient 不符合协议 DMServiceClient”:
但是,如果我删除对关联类型(端点)的约束,它编译时不会出现任何问题。因为 DCServiceEndpoint 符合约束 (DMServiceEndpoint),所以它似乎应该编译。关于我在这里缺少什么的任何想法?多谢你们!
generics - 在不指定具体关联类型的情况下对特征边界进行别名
我发现自己在相同的范围内使用参数编写不同的函数,如下所示:
觉得这有点麻烦,我试图给这些界限起别名。但是我没有找到办法。在检查了几个地方[1],[2]之后,我得到的最接近的是:
现在,作为一个例子,这编译得很好:
但是当我尝试使用它时:
我收到以下错误:
所以,没有运气。我该如何前进?
1 https://github.com/rust-lang/rust/issues/8634
2 https://stackoverflow.com/a/30424219/3957040
swift - Swift 协议类型别名中的默认类型可能吗?
我通常对一种或另一种编程范式的优点充满诗意,但今天我决定直接回答我的问题。所以我来了……</p>
我有 4-5 个类似的结构。在每一个中,前 3 个字段几乎相同。我将这些结构存储在一个数组中。由于每个结构都是它自己的类型,而且由于我已经听到的都是面向通用协议的编程,所以我决定让它们都符合协议。然后我可以像这样轻松地将它们保存在同一个数组中var tables: [DataHoldable]
:
所以,我知道我需要创建 5 个结构,所有这些都必须共享三个成员:format
、length
和language
。这是我正在谈论的一个简短示例:
正如你所看到的,TableE
它的所有字段都有更宽的整数,并且它的format
字段被签名以结束它。
所以,这就是我认为方便的typealias
功能可以发挥作用的地方。
我做了一个这样的协议:
我认为通过UInt16
为协议的关联类型分配默认类型,我不必UInt16
在前 4 个结构中显式声明,从而允许我绕过大量重新键入(双关语)。我在想有可能做这样的事情:
但是,情况似乎并非如此,因为无论我做了什么,我都开始犯错误。我什至创建了协议的扩展,因为我认为可以在扩展中使用默认的关联类型。然而,在这样做的时候,我引入了新的更可怕的错误。
我已经尝试了大约 10 种不同的组合和/或黑客和/或诡计,但似乎没有任何效果。
所以我的问题是:如果实际上不能使代码通用化,那么能够“通用化”代码又有什么意义呢?我错过了什么吗?任何帮助、想法、想法、可能的路线等将不胜感激。谢谢!
generics - 使用泛型时是否可以使用自引用关联类型?
示例:给定以下特征,
我希望每当一个类型的值与返回V
另一个类型的值相同类型的值时V
。每当将一个类型的值E
添加到另一个相同类型的值时,我都希望E
返回另一个值。
天真地,我认为这可能是正确的方向,
但这只是在黑暗中拍摄的。
Add
提供以下示例的文档,
但我无法理解如何以同样的方式为泛型类型提供实现,如果这是可能的话。
ios - Swift ViewModel 与 UITableViewCell 的关联类型
我有以下协议和 ViewModel
此设置允许我将 ViewModel 绑定到 TableViewCell 类。但我苦苦挣扎的地方是绑定本身:
到目前为止我想出的唯一解决方法是使用动态调度(performSelector
),我想知道是否有一种方法可以直接调用该方法而不使用运行时。