最近,我可以将一个扩展更改为:
extension Array where Element: Encodable { ... }至:
extension CollectionType where Generator.Element: Encodable { ... }为了以后能够在不同的扩展中应用带有CollectionType和Encodable的类型约束。
现在,我试图在Dictionary上做同样的事情,改变:
extension Dictionary where Key: StringLiteralConvertible, Value: Encodable { ... }至:
extension CollectionType where Generator.Element == (Key: StringLiteralConvertible, Value: Encodable) { ... }但是,后者似乎不能有效地替代Dictionary类型,因为现在不能在字典中调用扩展中定义的方法。
我如何定义CollectionType (或者SequenceType)的扩展,以便它的方法可供字典使用?
更新
我想指出的是,我尝试了添加类型约束,如下所示,但没有成功:
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要求-我宁愿不必这样做,保留对Array和Dictionary的扩展。
但是,我还需要为Optional变体编写扩展。我的理解是,由于它们使用泛型,所以不可能为Optional编写类型约束,将其限制为Array或Dictionary。
发布于 2015-08-12 19:42:33
这适用于我当前的用例:
extension CollectionType where Self: DictionaryLiteralConvertible, Self.Key: StringLiteralConvertible, Self.Value: Encodable, Generator.Element == (Self.Key, Self.Value) { ... }发布于 2016-11-22 15:32:40
谢谢你贴出你的解决方案确实有很大帮助,我把你的解决方案转换成了斯威夫特3,但不知道为什么它不适合我,所以我想发布我的解决方案,也许可以帮助其他人。
extension Collection where Self: ExpressibleByDictionaryLiteral, Self.Key: ExpressibleByStringLiteral, Self.Value: ExpressibleByStringLiteral, Iterator.Element == (key: Self.Key, value: Self.Value) { ... }我还能够将集合限制为特定类型:
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)
谢谢你的帮忙
https://stackoverflow.com/questions/31956520
复制相似问题