如何创建一个HalfOpenInterval,排除下限而不是上限

时间:2015-09-12 22:38:08

标签: swift swift2

这是一个范围从0.0到1.0但不包括1.0

的间隔
var interval = 0.0..<1.0
interval.contains(0.0)      //true
interval.contains(0.9999)   //true
interval.contains(1.0)      //false

我想创建一个范围从0.0到1.0但不包括0.0

的Interval
theIntervalIWant.contains(0.0)      //false
theIntervalIWant.contains(0.0001)   //true
theIntervalIWant.contains(1.0)      //true   

这不起作用,因为左值&gt;正确的价值(对吧?)

var interval2 = 1.0..<0.0

这不起作用,我不知道为什么不

var theIntervalIWant = 0.0>..1.0 

我错过了什么?

3 个答案:

答案 0 :(得分:2)

Swift中的{p> RangeSequenceType s,这意味着你可以迭代它们,这会引发一些并发症。例如,Range 1.3...2.56中有多少元素?每一步多少钱?

事实上,在Swift中你 Range Double:你得到的是..<运算符,是HalfOpenInterval,它是一种较轻的类型,主要用于检查其中是否包含某些东西。

制作自己的版本非常简单:

public struct HalfOpenStartInterval<Bound : Comparable> : IntervalType, Equatable, CustomStringConvertible, CustomDebugStringConvertible {
  public init(_ start: Bound, _ end: Bound) { (self.start, self.end) = (start, end) }
  public let start, end: Bound
  public var description: String {
    return String(reflecting: start) + ">.." + String(reflecting: end)
  }
  public var debugDescription: String { return description }
  @warn_unused_result
  public func contains(x: Bound) -> Bool { return x > start && x <= end }
  @warn_unused_result
  public func clamp(intervalToClamp: HalfOpenStartInterval<Bound>) -> HalfOpenStartInterval<Bound> {
    switch (intervalToClamp.start >= start, intervalToClamp.end <= end) {
    case (true, true)  : return intervalToClamp
    case (false, false): return self
    case (true, false) : return HalfOpenStartInterval(min(intervalToClamp.start, end), end)
    case (false, true) : return HalfOpenStartInterval(start, max(intervalToClamp.end, start))
    }
  }
  public var isEmpty: Bool { return start == end }
}

public func ==<B : Comparable>(lhs: HalfOpenStartInterval<B>, rhs: HalfOpenStartInterval<B>) -> Bool {
  return lhs.start == rhs.start && lhs.end == rhs.end
}

不幸的是,>..运算符是保留的,因此初始化程序有点冗长,但这是您如何使用它:

let theIntervalIWant = HalfOpenStartInterval(0.0, 1.0)

theIntervalIWant.contains(0.0)      //false
theIntervalIWant.contains(0.0001)   //true
theIntervalIWant.contains(1.0)      //true

答案 1 :(得分:0)

范围主要由操作员创建。标准库中仅定义了这些运算符:.....<

所以你必须自己制作这样的算子(>..),或者只使用0.000000001而不是0,这可能是最简单的方法。

答案 2 :(得分:0)

根据documentation,只有两个范围运算符:

  • 封闭范围运算符a...b
  • 半开放式操作员a..<b

你的问题非常有趣,这也是我在互联网上搜索的原因,但我没有找到一个非常简单而又很酷的解决方案。