ios - swift :围绕给定数字创建范围

标签 ios swift date time range

问题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,依此类推。

最佳答案

关于您的问题,您可以扩展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))
    }
}

关于您的关于舍入的第二个问题,如注释中已经提到的,您可以将值乘以n,将其舍入,然后再次除以n:
extension FloatingPoint {
    func rounded(to value: Self, roundingRule: FloatingPointRoundingRule = .toNearestOrAwayFromZero) -> Self { (self/value).rounded(roundingRule) * value }
}
16.rounded(to: 15)  // 15

关于ios - swift :围绕给定数字创建范围,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59292120/

相关文章:

ios - NSURLConnection 不调用方法(第一次工作)

mysql - 在MYSQL中简单的查询数据

python - 在 Pandas 数据框中筛选最接近月末的可用日期

iphone - 应用程序启动时,iPhone 的phonegap 应用程序不会从主页启动

iOS - 重置表单时显示 Eureka 验证错误

ios - 使用 AVFoundation,如何从视频的所有帧中删除中间 400 像素

iOS 13 : Twitter login not redirecting back to application

Angular 5 按日期排序

ios - 静默刷新另一个应用程序

ios - Paypal iOS SDK 无 View Controller