如何编写存储相同类型的Generator的通用Swift类

时间:2015-06-22 14:10:11

标签: swift generics

我正在尝试编写一个处理同类型对象的类,并且我想使用相同类型的(否则是任意的)生成器来提供这些对象。

本质上:

class MyGenericClass<T> {
  var source : GeneratorType
  var itemsProcessed = [ T ]()

  init(source: GeneratorType) {
    self.source = source
  }

  func getValue() -> T? {
    let item = source.next()
    if let item = item {
      itemsProcessed.append(item)
    }
    return item
  }
}

您可以这样称呼:

let myThing = MyGenericClass([ 1, 2, 3].generate())
let first   = myThing.getValue()

这引发:'GeneratorType'只能用作通用约束,因为它具有Self或相关的类型要求。

尝试了一些事情(例如GeneratorType<T>),但我无法弄清楚如何做到这一点。 如何告诉GeneratorType T是它的Element类型别名?

1 个答案:

答案 0 :(得分:2)

您必须使用生成器类型作为类型占位符sails.js, 并将其元素类型称为G

G.Element

(可选)为元素类型定义类型别名:

class MyGenericClass<G : GeneratorType> {
    var source : G
    var itemsProcessed : [ G.Element ] = []

    init(source: G) {
        self.source = source
    }

    func getValue() -> G.Element? {
        let item = source.next()
        if let item = item {
            itemsProcessed.append(item)
        }
        return item
    }
}

let myThing = MyGenericClass(source: [ 1, 2, 3].generate())
let first   = myThing.getValue()
println(first) // Optional(1)