我试图通过实现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>
可以实现这一点,因此它似乎是一种回归。