Swift中优雅的"有界"方法论

Jus*_*ney 1 swift

我正在寻找一种更优雅的方式为数字创建有限的限制器,主要是用于制作者.有很多技术可以确定值是否在边界内,但是我没有看到强制传入值符合这些边界的任何本机函数.

接受答案在这里很接近,但我想封顶值,而不是仅仅强制执行.

这是我到目前为止所拥有的.我不确定Int扩展.if-else如果可能的话,我宁愿将其折叠成一个优雅的代码行.理想情况下,我也希望缩短其中的实际实现struct.

extension Int {
    func bounded(_ min: Int, _ max: Int) -> Int {
        if self < min {
            return min
        } else if self > max {
            return max
        } else {
            return self
        }
    }
}

print(5.bounded(4, 6))  // 5
print(5.bounded(1, 3))  // 3
print(5.bounded(6, 9))  // 6

// Used in a sentence
struct Animal {
    var _legs: Int = 4
    var legs: Int {
        get {
            return _legs
        }
        set {
            _legs = newValue.bounded(1, 4)
        }
    }
}

var dog = Animal()
print(dog.legs) // 4
dog.legs = 3
print(dog.legs) // 3
dog.legs = 5
print(dog.legs) // 4
dog.legs = 0
print(dog.legs) // 1
Run Code Online (Sandbox Code Playgroud)

mat*_*att 5

这是Apple自己的方法,取自以下示例代码:

func clamp<T: Comparable>(value: T, minimum: T, maximum: T) -> T {
    return min(max(value, minimum), maximum)
}
Run Code Online (Sandbox Code Playgroud)

  • @dfd**1)**将像C或GLSL这样的低级语言的设计与像Swift这样的高级语言进行比较是毫无意义的.**2)**范围与使用两个单独的变量一样优化.`ClosedRange <T>`是一个结构,因此是存储在堆栈中的值类型.它不像是对象分配开销或任何东西.**3)**使用范围也会强制执行"min <max"的(否则不考虑)要求.**4)**使用范围使其与其他API更加一致,因此与其他Swift代码的互操作更容易. (2认同)