【问题标题】:Binary operator '/' cannot be applied to two 'T' operands二元运算符“/”不能应用于两个“T”操作数
【发布时间】:2023-03-10 16:06:01
【问题描述】:
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 
    }
}

创建计算属性时产生错误。如何解决?

【问题讨论】:

  • 这样想:T 可以任何东西进行比较。两个字符串怎么分割?
  • 请在您的问题中包含代码作为文本。 ??????
  • @the4kman: T 必须只是一个数字,如果我指定 struct PickerRange&lt;T: Numeric&gt; - 同样的错误。

标签: swift generics computed-properties


【解决方案1】:

只需指定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,因此指定其中之一就足够了。

编辑:

如何为 Int 和 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 不支持的 / 运算符。一种解决方法包括对您初始化结构的类型进行类型检查/强制转换:

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)

【讨论】:

  • 如何为 Int 和 Double 创建一个结构?如果我做struct PickerRange&lt;T:FloatingPoint &amp; SignedNumeric&gt; 那let range = PickerRange&lt;Int&gt;(start: 1, end: 5, step: 1) 得到一个错误:类型'Int'不符合协议'FloatingPoint'
  • 恐怕这是不可能的,因为/本质上是一个应用于两个特定类型实例的函数。 SignedNumeric 协议本身没有定义,FloatingPoint 或 SignedInteger 有。有一个解决方法。您需要检查特定类型并进行强制转换,然后调用所需的功能。我将编辑我的答案。
  • 完成。看看吧。
猜你喜欢
  • 2016-03-11
  • 2016-04-10
  • 2015-09-01
  • 2017-11-22
  • 2018-06-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多