我试图实现符合/扩展CollectionType
的协议,但是它并没有采用一种显然属于元素类型的通用类型,所以我'我希望能够计算/强制Generator.Element
的类型。
我将使用地图协议作为示例:
protocol Map : CollectionType {
typealias Key
typealias Value
subscript(key:Key) -> Value? { get }
}
我是否可以指定Self.Generator.Element
必须(Key, Value)
,除了输入作者类型的文档?
答案 0 :(得分:2)
您希望定义CollectionType
的子协议,并对CollectionType.Generator.Element
嵌套类型具有附加约束。这个嵌套类型属于CollectionType.Generator
嵌套类型,它被约束为GeneratorType
,因此首先我们需要引入一个带有附加约束的GeneratorType
子协议:
protocol KeyValueGeneratorType: GeneratorType {
associatedtype Key
associatedtype Value
mutating func next() -> (Key, Value)?
}
然后我们可以引入一个带有附加约束的CollectionType
子协议:
protocol KeyValueCollectionType: CollectionType {
associatedtype Generator: KeyValueGeneratorType
}
Dictionary
类型确实符合我们的协议,所以我们只需要一个简短的声明来表明这一点:
extension DictionaryGenerator: KeyValueGeneratorType {}
extension Dictionary: KeyValueCollectionType {}
答案 1 :(得分:1)
您必须创建要符合的生成元素类型。例如。
protocol SpecialElement {
typealias key : Int { get }
typealias Value : Int { get }
}
然后:
extension CollectionType where Self.Generator.Element: SpecialElement {
func addValues() -> Int {
var total = 0
for item in self {
total += item.Value
}
return total
}
}