【问题标题】:Swift 3.1 error: cannot invoke 'stride' with an argument list of typeSwift 3.1 错误:无法使用类型参数列表调用“跨步”
【发布时间】:2017-06-06 17:01:44
【问题描述】:

当我尝试以下代码时:

extension Int{

   func hello(to end: Int, by step: Int, task: (Int) -> Void ){

        for i in stride(from: 4, to: 8, by: 2) {

            task(i)
         }
     }
}

我收到错误消息:

错误:对于 i in stride(from: 4, to: 8, by: 2),无法使用类型为 '(from: Int, to: Int, by: Int)' 的参数列表调用 'stride'

注意:“stride”的重载存在这些部分匹配的参数列表:(to:Self,by:Self.Stride),(通过:Self,by:Self.Stride) for i in stride(from: 4, to: 8, by: 2)

我不明白为什么会发生这种类型的错误

【问题讨论】:

  • 我不能说为什么会发生这个特定错误,但如果它不在 Int 扩展中,它会按预期工作。
  • 比较stackoverflow.com/q/39602298/2976878。在您的特定情况下的问题是编译器看到 Swift 2 stride 方法,这些方法被声明为实例成员而不是全局函数(但现在不可用)。解决方法是一样的,在调用前加上模块名来消除歧义。

标签: swift3


【解决方案1】:

这有点棘手! :)

Int 显然声明了自己的stride 方法(这就是编译器向您显示存在部分匹配重载的原因),但不知何故我无法访问它们(编译器说它们被标记为不可用)。由于您在Int 扩展中,因此在此上下文中调用stride 等效于self.stride。而Int所具有的stride方法没有from:to:by:的参数,所以无法编译。

您想专门引用全局的stride 方法。只需指定定义该方法的模块,即Swift

extension Int{

   func hello(to end: Int, by step: Int, task: (Int) -> Void ){

        for i in Swift.stride(from: 4, to: 8, by: 2) {

            task(i)
         }
     }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-03-20
    • 1970-01-01
    • 1970-01-01
    • 2015-11-24
    相关资源
    最近更新 更多