SwiftUI / Xcode:ForEach 闭合范围与半开范围 - 文本函数错误。为什么会有这种差异?

SwiftUI / Xcode: ForEach closed range vs half open range - error with Text function. Why the difference?

提问人:Cabby 提问时间:11/8/2023 最后编辑:Mojtaba HosseiniCabby 更新时间:11/9/2023 访问量:46

问:

我有旧的 pascal 和 C 背景,最近开始学习 Swift。 我遇到了一个超出我常识的错误。

以下代码工作正常。

点击查看

ForEach(0..<12) { word in
    Text(String(word))
}

但是一旦 ForEach 从 ..< ... 它给出的错误为 无法将类型为“ClosedRange”的值转换为预期的参数类型“Range”

点击查看

ForEach(0...12) { word in
    Text(String(word))
}

现在这背后的机制/原因是什么? 以棕褐色的老编码背景,很难理解为什么。 感谢您的帮助。

SwiftUI foreach

评论

0赞 Cheok Yan Cheng 11/9/2023
这很奇怪。我没有遇到编译器错误,除了从IDE收到警告“非常量范围:参数必须是整数文字”。但代码仍然可行。您使用的是 XCode 15 吗?

答:

1赞 son 11/8/2023 #1

根据您的示例,有两种类型的范围。

  1. 第一个是半开范围。创建不包括最终元素的范围。
let half = 0..<5
//Range<Int>
  1. 第二个是封闭范围。创建包含最终元素的范围。
let closed = 0...5
//ClosedRange<Int>

在 SwiftUI 中,它以参数为参数,所以这就是你遇到错误的原因。它是不同的变量,例如:Float vs Double、Int vs Float 等。您可以在下面的文档中看到。ForEachRange

public init(_ data: Range, @TableRowBuilder content: @escaping (Int) -> Content) 其中 Data == Range, ID == Int, V == Content.TableRowValue

0赞 Mojtaba Hosseini 11/8/2023 #2

您应该为ClosedRange<Int>

ForEach(0...12, id: \.self) { word in
    Text(String(word))
}

在这里,我使用数字本身作为标识符。

💡 你也可以通过实现一个简单的扩展来使它工作,就像这样ForEach