如何在 Swift 中使用开放范围(两个边界都不包括)?

How can I use an open range (both bounds exclusive) in Swift?

我已经知道有一个内置运算符 ..< 叫做半开范围。但是我怎样才能获得“双开”范围,即不包含任何终端的范围?

为了澄清使用interval notation,如果a...b等同于[a, b],而a..<b等同于[a, b],那么[=24=是什么? ] 相当于 (a, b)?

理想情况下,我更愿意使用本机 Swift 功能来执行此操作。但是如果这不可能,我可以扩展 Range 来实现这个吗?

我尝试了一些方法,但我仍然不知道如何。

关于扩展 Range,SwiftLee 作者 Antoine Van Der Lee 在此处描述了如何定义自定义运算符:https://www.avanderlee.com/swift/custom-operators-swift/

使用链接博客 post 中的自定义中缀运算符示例作为模板,我想出了这个扩展来定义您的 'both-open' 范围:

import Foundation

infix operator >-<: RangeFormationPrecedence
extension Int {
    static func >-< (lhs: Int, rhs: Int) -> ClosedRange<Int> {
        return ClosedRange(uncheckedBounds: (lower: lhs + 1, upper: rhs - 1))
    }
}

for i in 5>-<8 {
    print(i)
}

请注意,虽然结果是 Range(具体是 ClosedRange<Int>),但运算符本身实际上是在 Int.

上定义的

运行 Swift 游乐场中的上述示例代码产生输出

6
7

因此您可以看到,通过使用自定义中缀运算符 >-<,生成的 'both-open' 范围从大于下限的数字 1 开始,上升到小于下限的数字 1上限。

(我尝试将运算符定义为 >.< 以平行于 half-open 范围运算符 ..<,但 Xcode 反对。)