【问题标题】:Swift `for-in` loop Range and ClosedRange errorsSwift `for-in` 循环范围和 ClosedRange 错误
【发布时间】:2020-03-30 18:44:49
【问题描述】:

我正在尝试编写简单的 Swift for 循环,如下所示:

for i in [0...10] {
    // ...
}

for i in [0..<10] {
    // ...
}

由于 Swift 中没有经典的 C 风格 for 循环,这些for-in 循环很重要。我正在尝试枚举通过 Swift 的 .....&lt; 语法构建的任何 Ints 数组。

请注意,如果我“手动”构造一个 Ints 数组而不是使用 [...][..&lt;],它可以正常工作:

for i in [0, 1, 2, 3, 4, 5] {
    // this works fine 
}

[0..&lt;5] 循环基本上在我尝试使用值i 的任何时候都会产生错误:

let _ = i + 1

这是我得到的错误:

- Binary operator `'+'` cannot be applied to operands of type `'ClosedRange<Int>'` and `'Int'`  

- Binary operator `'+'` cannot be applied to operands of type `'Range<Int>'` and `'Int'  `

我也试过这个:

let _ = String(i)

我得到:

Ambiguous reference to initializer `'init(_:)'`

为什么这些简单的for-in 循环不起作用?

为什么错误引用RangeClosedRange?我期待一个Int

【问题讨论】:

  • 如果立即在语言指南中找到解决方案,这真的值得一个自我回答的问题吗?
  • @MartinR 我只是花了太长时间试图自己解决这个问题。 尝试对错误消息进行 SEO。 潜在的常见误解:它是正确的 Range 类型,不是您创建的。正如人们所想的那样,“一个整数数组”。
  • 这个问题不是“错别字”...我非常特别地试图记录循环 [0, 1, 2, 3] Int 数组和 0...3 Range 之间的差异(以及生成的错误消息当您错误地循环遍历 [0...3] Array&lt;Range&gt;)。

标签: swift for-loop range for-in-loop


【解决方案1】:

范围

Swift 中有一个类型叫做Range。它是一个struct,可以像这样使用:

Range.init(uncheckedBounds: (lower: 0, upper: 10))

由于在代码中使用范围很常见,因此有一个语法糖,例如:

0..<10

所以当你说[0...10] 时,就像你说[Range.init(uncheckedBounds: (lower: 0, upper: 10))] 一样,这不是你要找的。​​p>

相反,您应该迭代 range 本身,例如:

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

额外:

ClosedRange 类似于Range,当然你可以去掉 Swift 中的 init 关键字:

ClosedRange(uncheckedBounds: (lower: 0, upper: 10)) // 0...10

【讨论】:

    【解决方案2】:

    Swift 范围写成0...10不是 [0...10]


    [0...10] 创建一个单项数组。数组中的第一项是0...10 范围。

    使用for i in [0...10] 因此迭代该单项数组,不是范围本身。迭代值i 的类型为RangeClosedRange

    要遍历范围中的每个Int,正如您所期望的那样,使用范围0...10 不带括号

    for i in 0...10 {
        // ...
    }
    
    for i in 0..<10 {
        // ...
    }
    

    https://docs.swift.org/swift-book/LanguageGuide/ControlFlow.html

    您还可以使用带有数字范围的 for-in 循环。此示例打印五次表中的前几个条目:

    for index in 1...5 {
        print("\(index) times 5 is \(index * 5)")
    }
    

    被迭代的序列是从 1 到 5 的数字范围(包括 1 到 5),如使用封闭范围运算符 (...) 所示。

    【讨论】:

      猜你喜欢
      • 2015-05-05
      • 2021-11-05
      • 2017-08-05
      • 2018-09-09
      • 1970-01-01
      • 2021-09-02
      • 1970-01-01
      • 1970-01-01
      • 2013-11-18
      相关资源
      最近更新 更多