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))
为了让您的stride语句产生,Double传递给 的值from必须是s。throughbyDouble
在第一种情况下,Swift 推断字面量0和11是Doubles,因为1.0是 a Double,这是它们匹配的唯一方法。这是有效的,因为Double符合ExpressibleByIntegerLiteral协议,这意味着您可以Double使用整数文字初始化 a ,并且可以在Double必要时推断整数文字为 a 。
在第二种情况下,您已经分配11给s并且 Swift 分配s了 type Int。因此,当您尝试在stride语句中使用它时,类型不匹配。
您可以通过多种方式解决此问题:
s成为一个Doublewith var s: Double = 11。在这种情况下,您已经明确指定了 的类型s,因此 Swift 使用ExpressibleByIntegerLiteral符合 的Double来初始化s。11是一个Doublewith var s = 11 as Double。在这里,您已经告诉 Swift 这11是Double因为Double符合ExpressibleByIntegerLiteral. 斯威夫特然后推断类型s也为Double。11为。这使用了一个将 a作为输入的初始化程序。然后 Swift从分配给它的值推断出的类型。Doublevar s = Double(11)DoubleIntsDoubles与 .一起使用时转换Double(s)。在这里,您显式使用Double初始化程序来创建Double带有Int s.s用Double文字声明with var s = 11.0。在这里,Swift 推断字面11.0量是类型Double,然后推断类型s也是 a Double,因为它是由 a 初始化的Double。