在swift中重载Single Equals

时间:2015-05-26 22:21:22

标签: ios swift operator-overloading

我有一种奇怪的情况,我似乎无法让单个等于超载

这很好用:

public func /=<T: ConvertibleUnit>(inout left: T, right: Int) {
    left.value = (left.value / Double(right))
}

一旦我改为:

public func =<T: ConvertibleUnit>(inout left: T, right: Int) {
    left.value = Double(right)
}

我收到错误:

没有匹配运营商声明的运营商实施

有什么疯狂的东西我不知道了吗?

我玩中缀并且它似乎做得不多。我假设它的解释是错误的?

2 个答案:

答案 0 :(得分:7)

没有骰子,我很害怕。来自language reference

  

标记=, - &gt;,//,/ *,* /,。,前缀运算符&lt;,&amp;和?,中缀运算符?,以及后缀运算符&gt;,!和?保留。这些令牌不能超载,也不能用作自定义操作符。

相反,如果您希望始终可以ConvertibleUnit创建Int,请为协议提供init(_ val: Int)方法,以便人们可以撰写let unit = T(42)。或者甚至可以考虑让它符合IntegerLiteralConvertible

通常,Swift中的首选样式不是在不同类型之间进行自动/隐式转换。这就是为什么,例如,您必须先将Int转换为Double,然后才能将其添加到另一个Double

当然,你可以这样写:

func +(lhs: Int, rhs: Double) -> Double {
    return Double(lhs) + rhs
}

let i = 1
let f = 1.2
i + f   // = 2.2

但这通常不被视为良好做法。

答案 1 :(得分:4)

Apple's official documentation中所述,

  

无法重载默认赋值运算符(=)。只有复合赋值运算符才能重载。同样,三元条件运算符(a?b:c)也不能重载。

你可以使用infix创建一个新的运算符,但遗憾的是你不能超载&#39; =&#39;。