快速范围大于下限

War*_*shi 5 nsrange swift swift3

我需要像这样实现经验过滤器

  • 0至2年
  • 2到4年

如何在快速范围内表达?

问题是我不能表达超过2至4年.虽然我可以做不到上限.比如这样

let underTen = 0.0..<10.0
Run Code Online (Sandbox Code Playgroud)

我需要这样的东西(大于下限)

let uptoTwo = 0.0...2.0
let twoPlus = 2.0>..4.0  // compiler error
Run Code Online (Sandbox Code Playgroud)

目前我在做

let twoPlus = 2.1...4.0
Run Code Online (Sandbox Code Playgroud)

但这并不完美.

dfr*_*fri 11

nextUp来自FloatingPoint协议

您可以利用的nextUp财产Double,如blueprinted FloatingPoint协议Double符合

下一部影片

比较大于此值的最不可表示的值.

对于任何有限值x,x.nextUp大于x....

即:

let uptoTwo = 0.0...2.0
let twoPlus = 2.0.nextUp...4.0
Run Code Online (Sandbox Code Playgroud)

在您的问题的评论中已经提到了该协议中已ulp蓝图的该属性FloatingPoint.对于大多数数字,这是self下一个更大的可表示数字之间的差异:

ULP

自我最后的单位.

这是有效数字中最低有效数字的单位 self.对于大多数数字x,这是x下一个更大(大小)可表示数字之间的差异....

nextUp确实,在本质上,返回的值self与添加ulp.因此,对于上面的示例,以下内容是等效的(而nextup在此用例中,imo 应该是首选).

let uptoTwo = 0.0...2.0 
let twoPlus = (2.0+2.0.ulp)...4.0
Run Code Online (Sandbox Code Playgroud)

您可能还需要考虑twoPlus使用upperBound前面uptoTwo范围的属性替换下限文字:

let uptoTwo = 0.0...2.0                       // [0, 2] closed-closed
let twoPlus = uptoTwo.upperBound.nextUp...4.0 // (2, 4] open-closed

if uptoTwo.overlaps(twoPlus) {
    print("the two ranges overlap ...")
}
else {
    print("ranges are non-overlapping, ok!")
}
// ranges are non-overlapping, ok!
Run Code Online (Sandbox Code Playgroud)