扩展CollectionType时计算元素类型

时间:2016-04-21 17:06:15

标签: swift protocols

我试图实现符合/扩展CollectionType的协议,但是它并没有采用一种显然属于元素类型的通用类型,所以我'我希望能够计算/强制Generator.Element的类型。

我将使用地图协议作为示例:

protocol Map : CollectionType {
    typealias Key
    typealias Value

    subscript(key:Key) -> Value? { get }
}

我是否可以指定Self.Generator.Element必须(Key, Value),除了输入作者类型的文档?

2 个答案:

答案 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       
     }
}