Swift 如何指示函数的返回值应符合协议?

Swift 如何指示函数的返回值应符合协议?,swift,Swift,我试图通过实现链interator来理解Swift中的泛型和协议(与pythonitertools一样,以前是为Swift的旧版本实现的) 我有一个工作实现: struct Chain<S: SequenceType> : SequenceType, GeneratorType { var sequences: [S] var generator: S.Generator init(sequences: [S]) { self.sequenc

我试图通过实现
interator来理解Swift中的泛型和协议(与pythonitertools一样,以前是为Swift的旧版本实现的)

我有一个工作实现:

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)
}
结构链:SequenceType,GeneratorType{ 变量序列:[S] 无功发生器:无功发生器 初始化(序列:[S]){ self.sequences=sequences.reverse() 生成器=self.sequences.removeLast().generate() } func generate()->链{//***[1] 回归自我 } 突变func next()->S.Generator.Element{ 虽然是真的{ 设elem=generator.next() 如果elem!=nil{ 返回元素 } 如果序列是空的{ 归零 } 生成器=序列。removeLast().generate() } } } func链(序列:S…->链{//***[2] 返回链(序列:序列) } 然而,对于我不得不使用的类型声明,我一点也不满意。 上面指出了有问题的行

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

  • GeneratorType
    (错误:协议“GeneratorType”只能用作一般约束)
  • 发电机(错误:不可转换)
我不明白为什么
Chain
是可以接受的,但是
GeneratorType
不是,当
Chain
GeneratorType
实现/继承时

在[2]的例子中,我认为
SequenceType
是合适的,但它失败了,出现了与上面
GeneratorType
类似的消息


为什么不能声明函数返回符合协议的对象?
在目标C中,这在id为的情况下是可能的,因此这似乎是一种回归。

无法返回直接协议的原因是,无论出于何种目的,协议都是通用的且未绑定的。GeneratorType是一个通用协议,如果没有关联的元素类型,它将无法生存。您所需要的,相当于say
->GeneratorType
。编译器正在抱怨,因为
GeneratorType
未绑定。要绑定它,您需要在模板部分声明一个别名,