gpt4 book ai didi

ios - 具有数字和可比较协议(protocol)的 Swift 泛型类

转载 作者:搜寻专家 更新时间:2023-10-31 19:31:54 30 4
gpt4 key购买 nike

我想写一个 swift 泛型类,它以数字为类型,也符合可比协议(protocol)。基本上我想要的是一个通用的 rangeValidator,它应该接受任何类型的数字(int、double、float)并返回它是否在给定范围内?

class NumberRangeValidator<T: Numeric,Comparable> {

var minValue: T
var maxValue: T

init(minValue: T, maxValue: T) {
self.minValue = minValue
self.maxValue = maxValue
}

func validate(_ value: T) -> Bool {
if case minValue...maxValue = value {
return true
}
return false
}
}

最佳答案

由于您的 class是一个“RangeValidator”,我建议让你的类初始化器采用 ClosedRange<T> .声明 T: Comparable允许您使用 range.contains(value)进行验证:

注意:无需将您的类(class)限制为 Numeric , 但如果你想那么你可以将其声明为 class NumberRangeValidator<T: Comparable & Numeric>正如评论中提到的@JoakinDanielson。

class NumberRangeValidator<T: Comparable & Numeric> {

let range: ClosedRange<T>

init(range: ClosedRange<T>) {
self.range = range
}

// allow range to be specified with minValue, maxValue
init(minValue: T, maxValue: T) {
guard minValue <= maxValue else { fatalError("Can't form Range with maxValue < minValue") }
self.range = minValue...maxValue
}

func validate(_ value: T) -> Bool {
return range.contains(value)
}
}

示例:

let validator = NumberRangeValidator(range: 10.0 ... 30.0)

print(validator.validate(9)) // false
print(validator.validate(10)) // true
print(validator.validate(20)) // true
print(validator.validate(30)) // true
print(validator.validate(31)) // false

let floatValidator = NumberRangeValidator(minValue: Float(0), maxValue: 5)
print(floatValidator.validate(0)) // true
print(floatValidator.validate(10)) // false

注意:没有理由必须是 class . struct也会完成这项工作。

关于ios - 具有数字和可比较协议(protocol)的 Swift 泛型类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57135129/

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