gpt4 book ai didi

Swift - 如何声明一个接收范围内数字的方法

转载 作者:行者123 更新时间:2023-11-28 10:00:07 24 4
gpt4 key购买 nike

我想创建一个函数,它的数字参数应该在 0..100 % 之间

我认为执行此操作的最佳方法是使用 FloatingPointType 协议(protocol)创建包装器类型,但我遇到了编译错误

Protocol 'FloatingPointType' can only be used as a generic constraint because it has Self or associated type requirements

struct Percent {
init(val : FloatingPointType) {
// enforce value is between 0..100
}
}


func hideView(percent : Percent) {
// percent is 0..100 at this point
.. do some work here
}

在编译时执行此条件的正确方法是什么?

最佳答案

更新:从 Swift 5.1 开始,使用 “property wrappers” 可以更轻松地实现这一点,例如参见 “Implementing a value clamping property wrapper”在 NSHipster 上。

最简单的方法是定义一个包含所需范围内的Double(或FloatInt):

struct P {
let val : Double
init (val : Double) {
// ...
}
}

但是如果你想处理不同的浮点类型那么你必须定义一个泛型类

struct Percent<T : FloatingPointType> {
let val : T
init(val : T) {
self.val = val
}
}

要比较您需要的值,还需要 Equatable:

struct Percent<T : FloatingPointType where T: Equatable> {
let val : T
init(val : T) {
if val < T(0) {
self.val = T(0)
} else if val > T(100) {
self.val = T(100)
} else {
self.val = val
}
}
}

例子:

let p = Percent(val: 123.4)
println(p.val) // 100.0

请注意,这要求 hideView() 也是通用的:

func hideView<T>(percent : Percent<T>) {
// percent.val has the type `T` and is in the range
// T(0) ... T(100)
}

关于Swift - 如何声明一个接收范围内数字的方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29863977/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com