首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何定义CollectionType的扩展,以便它的方法可供字典使用?

如何定义CollectionType的扩展,以便它的方法可供字典使用?
EN

Stack Overflow用户
提问于 2015-08-12 05:13:00
回答 2查看 1.4K关注 0票数 5

最近,我可以将一个扩展更改为:

代码语言:javascript
复制
extension Array where Element: Encodable { ... }

至:

代码语言:javascript
复制
extension CollectionType where Generator.Element: Encodable { ... }

为了以后能够在不同的扩展中应用带有CollectionTypeEncodable的类型约束。

现在,我试图在Dictionary上做同样的事情,改变:

代码语言:javascript
复制
extension Dictionary where Key: StringLiteralConvertible, Value: Encodable { ... }

至:

代码语言:javascript
复制
extension CollectionType where Generator.Element == (Key: StringLiteralConvertible, Value: Encodable) { ... }

但是,后者似乎不能有效地替代Dictionary类型,因为现在不能在字典中调用扩展中定义的方法。

我如何定义CollectionType (或者SequenceType)的扩展,以便它的方法可供字典使用?

更新

我想指出的是,我尝试了添加类型约束,如下所示,但没有成功:

代码语言:javascript
复制
extension CollectionType where Self: protocol<Indexable, SequenceType, DictionaryLiteralConvertible>, Self.Key: protocol<Hashable, StringLiteralConvertible>, Self.Value: Encodable, Self.Generator.Element == (Key: StringLiteralConvertible, Value: Encodable) { ... }

更新2

由于user2194039要求-我宁愿不必这样做,保留对ArrayDictionary的扩展。

但是,我还需要为Optional变体编写扩展。我的理解是,由于它们使用泛型,所以不可能为Optional编写类型约束,将其限制为ArrayDictionary

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-08-12 19:42:33

这适用于我当前的用例:

代码语言:javascript
复制
extension CollectionType where Self: DictionaryLiteralConvertible, Self.Key: StringLiteralConvertible, Self.Value: Encodable, Generator.Element == (Self.Key, Self.Value) { ... }
票数 2
EN

Stack Overflow用户

发布于 2016-11-22 15:32:40

谢谢你贴出你的解决方案确实有很大帮助,我把你的解决方案转换成了斯威夫特3,但不知道为什么它不适合我,所以我想发布我的解决方案,也许可以帮助其他人。

代码语言:javascript
复制
extension Collection where Self: ExpressibleByDictionaryLiteral, Self.Key: ExpressibleByStringLiteral, Self.Value: ExpressibleByStringLiteral, Iterator.Element == (key: Self.Key, value: Self.Value) { ... }

我还能够将集合限制为特定类型:

代码语言:javascript
复制
extension Collection where Self: ExpressibleByDictionaryLiteral, Self.Key == String, Self.Value == Array<String>, Iterator.Element == (key: Self.Key, value: Self.Value)

关键是Iterator.Element == (key: Self.Key, value: Self.Value)

谢谢你的帮忙

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/31956520

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档