Swift: 无法将类型 'Range<Int>' 的值转换为指定类型 'Int'

Swift: Cannot convert value of type 'Range<Int>' to specified type 'Int'

我试图实现一个小迭代,returns 某些范围的平方。

这应该是这个 Python 脚本的等价物

for i in range(n):
    print(i*i)

在Swift我试过了

第一次尝试

let numbers = [1..<10]

for i in numbers{
    print(i*i)
}

第二次尝试

let numbers = [1..<10]

for i in numbers{
    var j: Int = i
    print(j*j)
}

但是编译器说 Cannot convert value of type 'Range<Int>' to specified type 'Int'

根据我的 python 经验,我了解到这是由于 Swift 中的不同类型造成的。因此我的问题是

  1. 我该如何解决这个问题? (即实现我在 python 中所做的相同事情)
  2. 我的第一次和第二次尝试有什么问题?
  3. 为什么Swift中有这么多类型的<Int>

提前致谢!

您的代码无法编译,因为您在范围内使用了 [],这会创建一个数组。 [1..<10] 是范围的 数组 。然后 for 循环遍历该数组,该数组只有一个元素 - 范围 1..<10.

这就是为什么 iRange<Int> 类型的原因。是范围,不是范围内的数字。

只需删除 [],您的两个代码都可以工作。您可以直接迭代范围(实际上,任何符合 Sequence 协议的东西),而不仅仅是数组。您甚至可以将范围内嵌在循环中:

for i in 0..<10 {
    print(i * i)
}

Why are there so many types of <Int> in Swift?

你看错了,Range<Int>ClosedRange<Int> 类型中的 RangeClosedRange 不是修饰 [=23= 的词],好像它们是 Int 的不同“口味”。它是相反的 - Range<Bound> and ClosedRange<Bound> are generic types,并且 Range<Int> 可以被认为是 Range 的特定“类型”,它以 Int 为边界。例如,您也可以使用 Range<Float>Range<UInt8>