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

这段代码没问题,但是如果我写这个,就会出现“无法调用”的问题

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

1 回答 1

2

为了让您的stride语句产生,Double传递给 的值from必须是s。throughbyDouble

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

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

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

  1. 声明s成为一个Doublewith var s: Double = 11。在这种情况下,您已经明确指定了 的类型s,因此 Swift 使用ExpressibleByIntegerLiteral符合 的Double来初始化s
  2. 声明这11是一个Doublewith var s = 11 as Double。在这里,您已经告诉 Swift 这11Double因为Double符合ExpressibleByIntegerLiteral. 斯威夫特然后推断类型s也为Double
  3. 用转换11为。这使用了一个将 a作为输入的初始化程序。然后 Swift从分配给它的值推断出的类型。Doublevar s = Double(11)DoubleIntsDouble
  4. s与 .一起使用时转换Double(s)。在这里,您显式使用Double初始化程序来创建Double带有Int s.
  5. sDouble文字声明with var s = 11.0。在这里,Swift 推断字面11.0量是类型Double,然后推断类型s也是 a Double,因为它是由 a 初始化的Double
于 2017-05-08T15:57:46.823 回答