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
未绑定。要绑定它,您需要在模板部分声明一个别名,