Swift:调用 SequenceOf 的无参数扩展时缺少参数

标签 swift arguments ios8 sequence ios8-extension

有人能看出这个错误吗? 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 的通用子类型 TEquatable,但您可以仅在原始类型声明中提供这些约束,而不是在扩展中。

解决方案是将 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/

相关文章:

core-data - 如何从 iOS 8 扩展中获取 NSManagedObjectContext 实例

ios - 使用 AVPlayer 在后台播放视频会出现 AspectFill 和循环问题

html - 网页上的ajax完成后如何从url获取html

c - 在恢复线程时将参数传递给线程。 (WinAPI)

r - 将 R Shiny 应用程序保存为函数,并将参数传递给 Shiny 的应用程序

swift - didSelectItemAtIndexPath 未在 swift 中调用

iOS 8.0 - "failed to scene-update in time"崩溃

ios - 在 Xcode 上归档时按顺序使用 max() 和 min() 的 Swift 问题

ios - 如何在 swift 中使用 BLOB 将字节数组 [UInt8] 存储和检索到 sqlite3 数据库中?

javascript - 将参数作为对象文字发送的更好方法?