如何在 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 反对。)
我已经知道有一个内置运算符 ..<
叫做半开范围。但是我怎样才能获得“双开”范围,即不包含任何终端的范围?
为了澄清使用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 反对。)