swift 3步无法调用

swift 3 stride cannot invoke

var arr: [Double] = Array(stride(from: 0, through: 11, by: 1.0))

这段代码没问题, 但是如果我写这个,"cannot invoke" 问题就会出现

var s = 11
var arr: [Double] = Array(stride(from: 0, through: s, by: 1.0))

为了使您的 stride 语句产生 Double,传递给 fromthroughby 的值必须是 Doubles.

在第一种情况下,Swift 将文字 011 推断为 Doubles,因为 1.0Double这是他们匹配的唯一方式。这是有效的,因为 Double 符合 ExpressibleByIntegerLiteral 协议,这意味着您可以用整数文字初始化 Double 并且整数文字可以推断为 Double 如果必要的。

在第二种情况下,您已将 11 分配给 s,并且 Swift 将类型 s 分配给 Int。因此,当您尝试在 stride 语句中使用它时,类型不匹配。

您可以通过多种方式解决此问题:

  1. 声明 sDoublevar s: Double = 11。在这种情况下,您已经明确分配了 s 的类型,因此 Swift 使用 DoubleExpressibleByIntegerLiteral 一致性来初始化 s.
  2. 声明 11Doublevar s = 11 as Double。在这里你已经告诉 Swift 11 是一个 Double,因为 Double 符合 ExpressibleByIntegerLiteral。 Swift 然后推断出 s 的类型也是 Double.
  3. 使用 var s = Double(11)11 转换为 Double。这使用 Double 的初始值设定项,将 Int 作为输入。 Swift 然后根据分配给它的值推断 s 的类型为 Double
  4. Double(s)一起使用时转换s。在这里,您显式地使用 Double 初始值设定项来创建 DoubleInt s.
  5. Double 文字和 var s = 11.0 声明 s。在这里,Swift 将文字 11.0 推断为 Double 类型,然后将 s 的类型推断为 Double,因为它由 a 初始化Double.