我最近能够从以下位置更改扩展程序:
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
的类型约束。
答案 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)
感谢您的帮助