【问题标题】:Overload Single Equals in swift快速重载单个等于
【发布时间】:2015-05-26 22:21:22
【问题描述】:

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

这很好用:

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)
}

我得到错误:

没有匹配运算符声明的运算符实现

我错过了什么疯狂的明显东西吗?

我玩过中缀,但它似乎没有多大作用。我假设它的解释=错误?

【问题讨论】:

  • 我记不太清了,但我记得在某处读到 Swift 不允许您重载 = 运算符。

标签: ios swift operator-overloading


【解决方案1】:

恐怕没有骰子。来自language reference

标记 =、->、//、/*、*/、.,前缀运算符 、! 和 ?被保留。这些标记不能重载,也不能用作自定义运算符。

相反,如果您希望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

但这通常不是好的做法。

【讨论】:

    【解决方案2】:

    Apple's official documentation 中所述,

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

    你可以使用infix 创建一个新的运算符,但遗憾的是你不能重载'='。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-08-06
      • 1970-01-01
      • 2016-11-16
      • 2011-03-22
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多