如何定义CollectionType的扩展名以使其方法可用于词典?

时间:2015-08-12 05:13:01

标签: swift

我最近能够从以下位置更改扩展程序:

extension Array where Element: Encodable { ... }

为:

extension CollectionType where Generator.Element: Encodable { ... }

以便以后能够在不同的扩展程序中应用CollectionTypeEncodable的类型约束。

现在我尝试用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问 - 我不想这样做,并将扩展程序保留为ArrayDictionary

但是,我还需要编写Optional变体的扩展名。我的理解是,由于使用了泛型,因此无法为Optional写一个约束为ArrayDictionary的类型约束。

2 个答案:

答案 0 :(得分:2)

这适用于我目前的用例:

extension CollectionType where Self: DictionaryLiteralConvertible, Self.Key: StringLiteralConvertible, Self.Value: Encodable, Generator.Element == (Self.Key, Self.Value) { ... }

答案 1 :(得分:1)

感谢您发布您的解决方案确实有很多帮助,我将您的解决方案转换为swift 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)

感谢您的帮助