Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 具有数字和可比较协议的Swift通用类_Ios_Swift_Generics - Fatal编程技术网

Ios 具有数字和可比较协议的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) {

我想写一个swift泛型类,它以数字为类型,也符合可比较的协议。基本上我想要的是一个通用的
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