你如何表明函数的返回值应该符合协议?

时间:2014-08-06 12:46:13

标签: swift

我试图通过实现chain交互器来理解Swift中的泛型和协议(如在python itertools中,以及之前为旧版本的Swift in this once-excellent code实现的)。

我有一个有效的实施方案:

struct Chain<S: SequenceType> : SequenceType, GeneratorType {
    var sequences: [S]
    var generator: S.Generator

    init(sequences: [S]) {
        self.sequences = sequences.reverse()
        generator = self.sequences.removeLast().generate()
    }

    func generate() -> Chain<S> { // *** [1]
        return self
    }

    mutating func next() -> S.Generator.Element? {
        while true {
            let elem = generator.next()

            if elem != nil {
                return elem
            }

            if sequences.isEmpty {
                return nil
            }

            generator = sequences.removeLast().generate()
        }
    }
}

func chain<S: SequenceType>(sequences: S...) -> Chain<S> { // *** [2]
    return Chain(sequences: sequences)
}

但是,我对我必须使用的类型声明并不感到高兴。 有问题的行如上所示。

在[1]的情况下,我认为以下其中一项是合适的:

  • GeneratorType(错误:协议&#39; GeneratorType&#39;只能用作通用约束)
  • GeneratorOf<S.Generator.Element>(错误:不可转换)

Chain<S>实现/继承自GeneratorType时,我不明白为什么Chain<S>可以接受但GeneratorType不可接受?

在[2]的情况下,我认为SequenceType是合适的,但它失败了,上面有GeneratorType的类似消息。


为什么不能声明函数返回符合协议的对象? 在Objective C中,id<GeneratorType>可以实现这一点,因此它似乎是一种回归。

0 个答案:

没有答案