【问题标题】:Swift: Cannot convert value of type 'Range<Int>' to specified type 'Int'Swift:无法将类型“Range<Int>”的值转换为指定类型“Int”
【发布时间】:2021-07-31 11:52:41
【问题描述】:

我试图实现一个小的迭代,它返回一些范围的平方。

这应该是这个 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&lt;Int&gt;' to specified type 'Int'

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

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

提前致谢!

【问题讨论】:

  • "为什么 Swift 中有这么多类型的&lt;Int&gt;?"嗯,这是从哪里来的?您在问题中只提到了Range&lt;Int&gt;,而 one 不是“很多”...
  • 对了,你为什么决定把1..&lt;10 包含在[] 中?删除它们会使您的两个代码都工作。
  • 对不起,误导性的术语,从互联网上的浅层搜索中,我看到了 Range、ClosedRange 等。这些是“许多”&lt;Int&gt; 我的意思。
  • @Sweeper 谢谢!这样可行!我想在生成数组时,我们必须在它们周围有[]。

标签: swift xcode syntax


【解决方案1】:

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

这就是为什么i 的类型是Range&lt;Int&gt;。它是范围,而不是范围中的数字。

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

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

为什么 Swift 中有这么多类型的&lt;Int&gt;?

你看错了,Range&lt;Int&gt;和ClosedRange&lt;Int&gt;类型中的Range和ClosedRange不是修饰Int的词,好像它们是@的不同“风味” 987654339@。恰恰相反——Range&lt;Bound&gt; 和ClosedRange&lt;Bound&gt; 是generic types,而Range&lt;Int&gt; 可以被认为是Range 的特定“类型”,它以Int 为边界。例如,您还可以使用Range&lt;Float&gt; 或Range&lt;UInt8&gt;。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-11-11
    • 2016-10-25
    • 1970-01-01
    • 2020-02-18
    • 1970-01-01
    • 1970-01-01
    • 2017-06-29
    • 1970-01-01
    相关资源
    最近更新 更多