这是一个范围从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
的IntervaltheIntervalIWant.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
我错过了什么?
答案 0 :(得分:2)
Range
是SequenceType
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)