当前位置: 首页 > 面试题库 >

在Swift中将数字“限制”在两个值之间的标准方法

施念
2023-03-14
问题内容

鉴于:

let a = 4.2
let b = -1.3
let c = 6.4

我想知道将这些值限制在给定范围内的最简单,最快捷的方法0...5,例如:

a -> 4.2
b -> 0
c -> 5

我知道我可以执行以下操作:

let clamped = min(max(a, 0), 5)

或类似的东西:

let clamped = (a < 0) ? 0 : ((a > 5) ? 5 : a)

但是我想知道在Swift中是否还有其他方法可以做到这一点-
特别是,我想知道(并在SO上进行文档记录,因为在Swift中似乎没有关于夹紧数字的问题)中是否包含任何内容。 Swift标准库专门用于此目的。

可能没有,如果是的话,那也是我很乐意接受的答案。:)


问题答案:

该ClosedInterval类型已经有一个

func clamp(_ intervalToClamp: ClosedInterval<Bound>) -> ClosedInterval<Bound>

以另一个 间隔 作为参数的方法。Swift Evolution邮件列表上有一个建议

  • 添加钳位(值:绑定)->绑定到ClosedInterval

添加另一种将 单个值 钳位到给定间隔的方法:

/// Returns `value` clamped to `self`.
func clamp(value: Bound) -> Bound

而这正是您所需要的。

使用现有clamp()方法的实现在

  • https://github.com/apple/swift/blob/master/stdlib/public/core/Interval.swift.gyb

例如,此附加clamp()方法可以实现为

extension ClosedInterval {
    func clamp(value : Bound) -> Bound {
        return self.start > value ? self.start
            : self.end < value ? self.end
            : value
    }
}

例:

(0.0 ... 5.0).clamp(4.2)    // 4.2
(0.0 ... 5.0).clamp(-1.3)   // 0.0
(0.0 ... 5.0).clamp(6.4)    // 5.0

ClosedInterval通用 类型

public struct ClosedInterval<Bound : Comparable> { ... }

因此,该工程不仅为Double但这些都是类型Comparable(如IntCGFloatString,…):

(1 ... 3).clamp(10)      // 3
("a" ... "z").clamp("ä") // "ä"

Swift 3(Xcode 8)的 更新
ClosedInterval已重命名为ClosedRange,其属性lower/upperBound现在为:

extension ClosedRange {
    func clamp(_ value : Bound) -> Bound {
        return self.lowerBound > value ? self.lowerBound
            : self.upperBound < value ? self.upperBound
            : value
    }
}


 类似资料:
  • 问题内容: 我试图在仅Swift代码中计算两个CLLocation点之间的方位角。我遇到了一些困难,并假设这是一个非常简单的功能。堆栈溢出似乎没有列出任何内容。 我的ltan2调用关于左值cgfloat或其他错误… 问题答案: 这是一个Objective-C解决方案 您的代码对我来说似乎不错。没事的没错。您没有指定结果有多远,但是您可以尝试将弧度/度转换器转换为: 如果得到负方位角,2*M_PI则

  • 问题内容: 如何在Swift中将用户的TextField输入限制为数字? 问题答案: 您可以使用的方法将用户的输入限制为数字: 为Swift 3更新:

  • 我的应用程序包含5个ViewControllers的TabBar控制器可以单击每个viewcontrollers中的一个按钮,该按钮将弹出另一个视图,用户可以在其中选择一个设置。按钮(被点击)应该根据每个ViewController中选择的设置来改变其背景。因此,如果用户点击VC1中的按钮并选择设置,该信息应该传播到所有其他VC中,以便按钮具有相同的背景。 我正在使用故事板,我知道这很容易在2VC

  • 问题内容: 我想在两个小十进制数字之间获取一个随机数。 在0.8到1.3之间。 要么 谢谢! 问题答案: 斯威夫特5: 使用random(in :) 返回指定范围内的随机值: 每个苹果: random()静态方法从范围内的连续均匀分布中选择一个随机值,然后将该值转换为该类型中最接近的可表示值。 请参阅random(in:using:)以指定默认值以外的随机生成器。

  • 问题内容: 在JavaScript中,如果窗口大小大于500px,我要告诉浏览器执行某些操作。我这样做是这样的: 这很好用,但是我想使用相同的方法,但是要有一定范围的数字。因此,如果窗口大小在500像素到600像素之间,我想告诉我的浏览器来做一些事情。我知道这行不通,但是这是我的想象: 在JavaScript中甚至可能吗? 问题答案: 测试是否大于或小于表示值或值本身均不会导致条件变为真。

  • 我正在尝试解决此问题: 一位物理教授给班上的学生做项目。学生们必须组成一个两人小组来做这个项目。教授让学生来决定队伍。一个班级的学生人数将是偶数。 每个学生都有自己的知识水平。它告诉每个学生有多少知识。一个团队的知识水平是两个学生知识水平的总和。 学生们决定组成小组,这样知识最高的团队和知识最低的团队之间的差异就最小了。 投入 输入的第一行将包含测试用例的数量t;在接下来的t行中,第一个数字是n,