二元运算符“/”不能应用于两个 'T' 操作数
Binary operator '/' cannot be applied to two 'T' operands
struct PickerRange<T: Comparable> {
var start: T
var end: T
var step: T
var length: T {
// Binary operator '/' cannot be applied to two 'T' operands.
return max(start, end) - min(start,end) / step
}
}
创建计算属性时发生错误。如何解决?
只需指定 Numeric
协议之一。
对于浮点精度:
struct PickerRange<T:FloatingPoint> {
var start: T
var end: T
var step: T
var length: T {
return max(start, end) - (min(start,end) / step)
}
}
SignedInteger
、UnsignedInteger
或其他 Numeric
协议也是一种选择。
// Comparable
这些都不需要您另外指定 Comparable
,因此指定其中一个就足够了。
编辑:
How to make one structure for Int and Double?
本质上,您可以,通过指定 SignedNumeric:
struct PickerRange<T:SignedNumeric & Comparable> {
var start: T
var end: T
var step: T
}
// Treated as PickerRange<Double>
let a = PickerRange(start: 1.0, end: 5.0, step: 1)
// Treated as PickerRange<Int>
let b = PickerRange(start: 1, end: 5, step: 1)
但是,您有专门的 length
属性,其中包括 SignedNumeric
不支持的 /
运算符。解决方法包括 type-checking/force-casting 到您已使用以下方法初始化结构的类型:
struct PickerRange<T:SignedNumeric & Comparable> {
var start: T
var end: T
var step: T
var length: T {
if T.self is Double.Type {
return (max(start, end) as! Double) - ((min(start, end) as! Double) / (step as! Double)) as! T
} else if T.self is Int.Type {
return (max(start, end) as! Int) - ((min(start, end) as! Int) / (step as! Int)) as! T
} else {
return 0
}
}
}
let a = PickerRange(start: 1.0, end: 5.0, step: 1)
let b = PickerRange(start: 1, end: 10, step: 1)
print(a.length)
print(b.length)
struct PickerRange<T: Comparable> {
var start: T
var end: T
var step: T
var length: T {
// Binary operator '/' cannot be applied to two 'T' operands.
return max(start, end) - min(start,end) / step
}
}
创建计算属性时发生错误。如何解决?
只需指定 Numeric
协议之一。
对于浮点精度:
struct PickerRange<T:FloatingPoint> {
var start: T
var end: T
var step: T
var length: T {
return max(start, end) - (min(start,end) / step)
}
}
SignedInteger
、UnsignedInteger
或其他 Numeric
协议也是一种选择。
// Comparable
这些都不需要您另外指定 Comparable
,因此指定其中一个就足够了。
编辑:
How to make one structure for Int and Double?
本质上,您可以,通过指定 SignedNumeric:
struct PickerRange<T:SignedNumeric & Comparable> {
var start: T
var end: T
var step: T
}
// Treated as PickerRange<Double>
let a = PickerRange(start: 1.0, end: 5.0, step: 1)
// Treated as PickerRange<Int>
let b = PickerRange(start: 1, end: 5, step: 1)
但是,您有专门的 length
属性,其中包括 SignedNumeric
不支持的 /
运算符。解决方法包括 type-checking/force-casting 到您已使用以下方法初始化结构的类型:
struct PickerRange<T:SignedNumeric & Comparable> {
var start: T
var end: T
var step: T
var length: T {
if T.self is Double.Type {
return (max(start, end) as! Double) - ((min(start, end) as! Double) / (step as! Double)) as! T
} else if T.self is Int.Type {
return (max(start, end) as! Int) - ((min(start, end) as! Int) / (step as! Int)) as! T
} else {
return 0
}
}
}
let a = PickerRange(start: 1.0, end: 5.0, step: 1)
let b = PickerRange(start: 1, end: 10, step: 1)
print(a.length)
print(b.length)