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

zy1mlcev  于 2023-03-16  发布在  Swift
关注(0)|答案(2)|浏览(120)

我已经知道有一个内置的运算符..<,叫做半开区间,但是我怎样才能得到一个“两个都开”的区间,也就是说一个区间不包含任何一个终端呢?
使用interval notation时,如果a...b等价于[a,B],a..<b等价于[a,b),那么(a,b)在Swift中的等价形式是什么?
理想情况下,我更愿意使用Swift的原生功能来实现这一点,但是如果这不可能,我可以扩展Range来实现吗?
我试过了,但我还是不知道该怎么做。

jyztefdp

jyztefdp1#

关于扩展Range,SwiftLee的作者Antoine货车Der Lee在这里描述了如何定义自定义运算符:https://www.avanderlee.com/swift/custom-operators-swift/
使用自定义中缀运算符的例子从链接的博客文章作为一个模板,我想出了这个扩展来定义您的'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 Playground中运行上述示例代码将生成以下输出

6
7

因此,您可以看到,通过使用自定义中缀运算符>-<,得到的“both-open”范围从比下限大1的数字开始,向上到比上限小1的数字。
(我尝试将该操作符定义为>.<,以与半开域操作符..<并行,但Xcode反对。)

eni9jsuy

eni9jsuy2#

您可以对大多数浮点数使用nextUp

let lowerBound: Double = 3.0
let upperBound: Double = 5.0
let openRange = lowerBound.nextUp..<upperBound

(其中openRange包括3.05.0之间的所有值,但不包括3.05.0
Int在默认情况下没有这个功能,但是您可以扩展它并做同样的事情。

extension Int {
    var nextUp: Int {
        self + 1
    }
}

相关问题