Swift 二进制运算符'/';不能应用于两个';T';操作数 struct pickerage{ 变量开始:T 变量结束:T var阶跃:T 变量长度:T{ //二进制运算符“/”不能应用于两个“T”操作数。 返回最大值(开始,结束)-最小值(开始,结束)/步长 } }

Swift 二进制运算符'/';不能应用于两个';T';操作数 struct pickerage{ 变量开始:T 变量结束:T var阶跃:T 变量长度:T{ //二进制运算符“/”不能应用于两个“T”操作数。 返回最大值(开始,结束)-最小值(开始,结束)/步长 } },swift,generics,computed-properties,Swift,Generics,Computed Properties,创建计算属性时生成错误。如何修复?只需指定一个数值协议即可 对于浮点精度: 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)

创建计算属性时生成错误。如何修复?

只需指定一个
数值协议即可

对于浮点精度:

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 
    }
}
但是,您有专门的
length
属性,其中包括
/
运算符,该运算符不受
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)
struct pickerage{
变量开始:T
变量结束:T
var阶跃:T
变量长度:T{
如果T.self为双精度,则键入{
返回(最大值(开始,结束)为!Double)-(最小值(开始,结束)为!Double)/(步骤为!Double))为!T
}如果T.self是Int.Type,则为else{
返回(最大值(开始,结束)为!Int)-(最小值(开始,结束)为!Int)/(步骤为!Int))为!T
}否则{
返回0
}
}
}
设a=拾取(开始:1.0,结束:5.0,步骤:1)
设b=pickerage(开始:1,结束:10,步骤:1)
打印(a.长度)
打印(b.长度)

这样想:
T
可以是任何可比较的东西。如何划分两个字符串?请在问题中包含代码作为文本@4kman:
T
必须只是一个数字,如果我指定
struct pickerage
-同样的错误。如何为Int和Double创建一个结构?如果我做了
struct pickerage
let range=pickerage(开始:1,结束:5,步骤:1)
得到一个错误:类型“Int”不符合协议“FloatingPoint”,恐怕这是不可能的,因为
/
本质上是一个应用于特定类型的两个实例的函数
SignedNumeric
协议本身没有定义,
FloatingPoint
SignedInteger
do。这有一个解决办法。您需要检查特定类型并进行强制转换,然后调用所需的功能。我将编辑我的答案。完成。过来看。
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)
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)