我有一种奇怪的情况,我似乎无法让单个等于超载
这很好用:
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)
}
我收到错误:
没有匹配运营商声明的运营商实施
有什么疯狂的东西我不知道了吗?
我玩中缀并且它似乎做得不多。我假设它的解释是错误的?
答案 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;。