【问题标题】:Swift: create a range around a given numberSwift:围绕给定数字创建一个范围
【发布时间】:2019-12-11 18:41:18
【问题描述】:

问题 1

在我的代码中,我需要验证一个数字(DoubleInt)是否在该数字周围的特定范围内(具有指定的容差)。

例如,中心数为15,公差为5,则范围为:10-20

13、18、19 都在这个范围内。

目前我正在通过以下方式对其进行检查:

if (15 - unit)...(15 + unit) ~= accentedMinute {
  accentedMinute = 15
} else if (30 - unit)...(30 + unit) ~= accentedMinute {
  accentedMinute = 30
} else {
  accentedMinute = 45
}

我有兴趣使用更简单的方法来解决这个问题,例如:

if Range(center: 15, tolerance: unit) ~= accentedMinute {
  accentedMinute = 15
} else if Range(center: 30, tolerance: unit) ~= accentedMinute {
...

问题 2

也许,这种方法可以进一步简化,最终目标是将数字“捕捉”到某个范围内最接近的数字。

例如,要捕捉到的数字集是0, 15, 30, 45, 60 (snaps to 0)

给定一个数字13,它应该捕捉到15,依此类推。

【问题讨论】:

  • 除以 15,四舍五入到最接近的整数,然后再乘以 15。比较stackoverflow.com/q/27922406/1187415
  • 最接近是什么意思? 16的snap应该是什么?
  • @LeoDabus 16 应该对齐到 15
  • 顺便说一句,abs(unit - 15) <= tolerance
  • @MartinR 成功了,谢谢!

标签: ios swift date time range


【解决方案1】:

关于您的问题,您可以扩展 Range/ClosedRange 并创建一个自定义初始化程序以按照您的意愿行事:

extension Range where Bound: AdditiveArithmetic & ExpressibleByIntegerLiteral {
    init(center: Bound, tolerance: Bound) {
        self.init(uncheckedBounds: (lower: center - tolerance, upper: center + tolerance + 1))
    }
}

extension ClosedRange where Bound: AdditiveArithmetic {
    init(center: Bound, tolerance: Bound) {
        self.init(uncheckedBounds: (lower: center - tolerance, upper: center + tolerance))
    }
}

关于你关于四舍五入的问题二,正如 cmets 中已经提到的,你可以将你的值乘以 n,四舍五入,然后再除以 n

extension FloatingPoint {
    func rounded(to value: Self, roundingRule: FloatingPointRoundingRule = .toNearestOrAwayFromZero) -> Self { (self/value).rounded(roundingRule) * value }
}

16.rounded(to: 15)  // 15

【讨论】:

  • 感谢您回答问题1!我正在推进 q2 的答案,因为这是必须解决的问题。
猜你喜欢
  • 2019-02-23
  • 1970-01-01
  • 2012-09-04
  • 1970-01-01
  • 1970-01-01
  • 2013-08-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多