有人能看出这个错误吗? Playground 坚持认为缺少参数 #2,但没有参数 #1!
代码的目的是计算可等式值的运行次数,并返回由值及其计数组成的元组序列。我对这段代码进行了大量工作,对其进行了优化和改进,直到我非常确定它应该可以工作为止……但是尽管它可以编译,但我无法按照预期的方式调用它。
我调用下面的代码得到的错误是missing argument for parameter #2 in call
extension SequenceOf {
func CountRuns<T: Equatable>() -> SequenceOf<(T, Int)> {
return SequenceOf<(T, Int)>([])
return SequenceOf<(T, Int)> { () -> GeneratorOf<(T, Int)> in
var generator = self.generate()
var previousValue: T?
var start = true
return GeneratorOf<(T, Int)> { () -> (T, Int)? in
var count = 1
var retValue: (T, Int)?
while(true) {
var value = generator.next() as T?
if start {
previousValue = value
start = false
} else if value != nil && value! == previousValue! {
count++
} else {
if previousValue != nil {
retValue = (previousValue!, count)
}
previousValue = value
break
}
}
return retValue
}
}
}
}
println(SequenceOf(y).CountRuns())
Playground execution failed: <EXPR>:327:23: error: missing argument for parameter #2 in call
println(SequenceOf(y).CountRuns())
^
最佳答案
您遇到的问题是,您实际上无法使用进一步专门化泛型子类型的方法来扩展泛型类型。也就是说,您的 countRuns
方法要求 SequenceOf
的通用子类型 T
是 Equatable
,但您可以仅在原始类型声明中提供这些约束,而不是在扩展中。
解决方案是将 countRuns
声明为顶级函数,如下所示:
func countRuns<T: Equatable>(s: SequenceOf<T>) -> SequenceOf<(T, Int)> {
return SequenceOf<(T, Int)> { () -> GeneratorOf<(T, Int)> in
// note the change from self.generate() to s.generate() here
var generator = s.generate()
var previousValue: T?
var start = true
return GeneratorOf<(T, Int)> { () -> (T, Int)? in
var count = 1
var retValue: (T, Int)?
while(true) {
var value = generator.next() as T?
if start {
previousValue = value
start = false
} else if value != nil && value! == previousValue! {
count++
} else {
if previousValue != nil {
retValue = (previousValue!, count)
}
previousValue = value
break
}
}
return retValue
}
}
}
println(countRuns(SequenceOf(y)))
这在 this NSHipster article 的末尾进行了(一点)介绍.
关于Swift:调用 SequenceOf 的无参数扩展时缺少参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26156180/