问题1
在我的代码中,我需要验证数字(Double
或Int
)是否落在该数字周围的特定范围内(具有指定的容差)。
例如,中心编号为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/