【问题标题】:Binary operator '+' cannot be applied to two 'T' operands二元运算符“+”不能应用于两个“T”操作数
【发布时间】:2016-03-11 14:05:57
【问题描述】:

我正在使用泛型添加不同的类型,如 Int、Double、Float 等。我使用了下面的代码,但出现错误“二进制运算符 '+' 不能应用于两个 'T' 操作数”。

func add<T>(num1: T,num2: T) -> T {
    return num1 + num2
}

【问题讨论】:

  • 问题是……?
  • 如果类型 不是数字怎么办?发生了什么事?
  • @A-Live 显然,问题是 “为什么我会收到这个错误? / 如何修复我的代码,以免出现该错误?” 像你这样的有毒 sass 没有帮助。

标签: swift


【解决方案1】:

Swift 不知道泛型类型 T 有一个 '+' 运算符。您不能在任何类型上使用 +:例如在两个视图控制器上 + 没有太大意义

您可以使用协议一致性让 swift 了解您的类型的一些信息!

我在操场上玩了一下,这可能就是您要找的东西 :)

protocol Addable {
    func +(lhs: Self, rhs: Self) -> Self
}

func add<T: Addable>(num1: T, _ num2: T) -> T {
    return num1 + num2
}

extension Int: Addable {}
extension Double: Addable {}
extension Float: Addable {}

add(3, 0.2)

如果您需要此处解释的任何概念,请告诉我

【讨论】:

  • 尝试添加(CGFloat(2.5), Float(2.0))
  • @LeoDabus Swift 没有为 CGFloat 和 Float 定义 +。为了解决这个问题,您可以为 CGFloat 和 Float 定义 +。或者,您可以稍微更改解决方案以转换为第一种类型。
  • 我相信 Swift 3 协议必须使用 static 关键字,例如: 协议 Addable { static func +(lhs: Self, rhs: Self) -> Self }
  • 这很违反直觉,即 1. 您必须扩展您希望它使用的类型。 2. 你的泛型必须真正符合,并且它不是真正的泛型......这导致了一个有趣的结论:如果你曾经对你的泛型进行任何类型的计算(指定一些东西并因此限制它能够应对该规范),那么你需要为它定义一个协议,或者使用一些协议......
【解决方案2】:

在 Swift 4 / Xcode 9+ 中,您可以利用 Numeric protocol

func add<T: Numeric>(num1: T, num2: T) -> T {
    return num1 + num2
}

print(add(num1: 3.7, num2: 44.9)) // 48.6
print(add(num1: 27, num2: 100))  // 127

使用这意味着您不必自己创建特殊协议。

这仅适用于您需要 Numeric 协议提供的功能的情况。您可能需要对 % 和其他运算符执行类似于 @adam 的回答,或者您可以利用 Apple 在 Xcode 9 SDK 中提供的其他协议。

【讨论】:

  • 但是使用此解决方案,所有类型都必须相同...类型必须能够不同,即 Int + Float
【解决方案3】:

对于那些希望使用比较例如 &lt;&gt; 等的人,只需告诉 Swift 您的泛型类型采用可兼容协议,如下所示:-

func genericComparison&lt;T: Comparable&gt;(left: LinkedList&lt;T&gt;, right: LinkedList&lt;T&gt;) -&gt; LinkedList&lt;T&gt;

【讨论】:

  • 事实上,如果您将Comparable 放在班级级别,它也可以解决目的。像这样:final class BSTree&lt;Type: Comparable&gt; 没有左右。
【解决方案4】:

要添加num1num2,首先需要确保它是Numeric 类型。所以,代码应该是这样的:

func add<T : Numeric>(num1: T,num2: T) -> T {
    return num1 + num2
}

【讨论】:

    猜你喜欢
    • 2023-03-10
    • 2016-04-10
    • 2015-09-01
    • 2017-11-22
    • 2018-06-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多