Ios 具有数字和可比较协议的Swift通用类
我想写一个swift泛型类,它以数字为类型,也符合可比较的协议。基本上我想要的是一个通用的Ios 具有数字和可比较协议的Swift通用类,ios,swift,generics,Ios,Swift,Generics,我想写一个swift泛型类,它以数字为类型,也符合可比较的协议。基本上我想要的是一个通用的rangeValidator,它应该接受任何类型的数字(int、double、float),并返回它是否在给定的范围内 class NumberRangeValidator<T: Numeric,Comparable> { var minValue: T var maxValue: T init(minValue: T, maxValue: T) {
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 numberArrangeValidator{
var最小值:T
var最大值:T
初始化(最小值:T,最大值:T){
self.minValue=minValue
self.maxValue=maxValue
}
func验证(u值:T)->Bool{
如果案例minValue…maxValue=值{
返回真值
}
返回错误
}
}
由于您的类是一个“RangeValidator”,我建议让您的类初始值设定项使用ClosedRange
。声明T:Comparable
允许您使用range.contains(value)
进行验证:
注意:没有必要将您的类限制为数字
,但是如果您想,您可以将其声明为class NumberRangeValidator
,如注释中提到的@joakindielson
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)
}
}
注意:没有理由将其作为类。struct
也可以完成这项工作。您不需要以数字为目标。您正在寻找范围功能,所以您所需要的只是T具有可比性。为什么不干脆0.0…1.0~=value
?值得一提的是,如果OP想将类限制为仅使用数字,则可以将声明修改为class NumberRangeValidator
谢谢@JoakimDanielson!我把它加到了答案上。
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