【发布时间】:2018-05-11 16:09:40
【问题描述】:
运算符重载
Swift 4.1,Xcode 9.3
我正在尝试在 Swift 中创建一个二次方程函数。
在处理这个问题时,我发现我需要重载一些运算符,以便我可以使用元组以及其他数字(在本例中为 Double),这是因为我需要使用我的自定义 ± 运算符。尽管我在二次函数中只使用 Double 类型的值,但我决定使用泛型来使重载的运算符更加灵活,以备将来使用。
但是——由于我不明白的原因——我收到了关于声明重载 / 运算符的错误。
自定义 ± 运算符 - 工作
infix operator ± : AdditionPrecedence
public func ± <T: Numeric>(left: T, right: T) -> (T, T) {
return (left + right, left - right)
}
二次函数 - 工作
func quadratic(a: Double, b: Double, c: Double) -> (Double, Double) {
return (-b ± sqrt((b * b) - (4 * a * c))) / (2 * a)
}
重载运算符 - 部分工作¹
//Binary operator '/' cannot be applied to two 'T' operands
func / <T: Numeric>(lhs: (T, T), rhs: T) -> (T, T) {
return (lhs.0 / rhs, lhs.1 / rhs)
}
func * <T: Numeric>(lhs: (T, T), rhs: T) -> (T, T) {
return (lhs.0 * rhs, lhs.1 * rhs)
}
func - <T: Numeric>(lhs: (T, T), rhs: T) -> (T, T) {
return (lhs.0 - rhs, lhs.1 - rhs)
}
func + <T: Numeric>(lhs: (T, T), rhs: T) -> (T, T) {
return (lhs.0 + rhs, lhs.1 + rhs)
}
//Binary operator '/' cannot be applied to two 'T' operands
func / <T: Numeric>(lhs: T, rhs: (T, T)) -> (T, T) {
return (lhs / rhs.0, lhs / rhs.1)
}
func * <T: Numeric>(lhs: T, rhs: (T, T)) -> (T, T) {
return (lhs * rhs.0, lhs * rhs.1)
}
func - <T: Numeric>(lhs: T, rhs: (T, T)) -> (T, T) {
return (lhs - rhs.0, lhs - rhs.1)
}
func + <T: Numeric>(lhs: T, rhs: (T, T)) -> (T, T) {
return (lhs + rhs.0, lhs + rhs.1)
}
1. 我只收到/ 运算符的这些错误,而不是任何其他重载运算符(+、- 或 *)。
有错误的重载运算符 (/s) - 不工作
//Binary operator '/' cannot be applied to two 'T' operands
func / <T: Numeric>(lhs: (T, T), rhs: T) -> (T, T) {
return (lhs.0 / rhs, lhs.1 / rhs)
}
//Binary operator '/' cannot be applied to two 'T' operands
func / <T: Numeric>(lhs: T, rhs: (T, T)) -> (T, T) {
return (lhs / rhs.0, lhs / rhs.1)
}
假设: 我认为我在重载 / 运算符本身的声明中使用运算符 / 的事实 - 尽管它是在不同的上下文中使用的事实 - 导致错误。
最后一个问题:
如何解决错误,同时仍保持重载运算符的灵活性?
额外问题 1: 如果可以(我认为我可能必须返回 String 来完成此任务),我还想制作一个可以返回精确解的独立二次函数?
额外问题 2: 另外,如果有人知道如何制作一个单独的函数来解决 三次 方程而不是二次方程,那将也值得赞赏。
【问题讨论】:
-
我不认为一对(大小为 2 的元组)是结果的合适选择。我认为最好使用可以正确建模 3 种情况的枚举:两种解决方案,一种解决方案,零解决方案
-
@Alexander,你认为创建一个包含变量的
struct是个好主意吗:var a1 : Double、var a2 : Double,然后返回这个struct。另外,这样做有什么好处? -
否,因为该结构不能对具有 1 个值或 0 个值的模型进行建模。你需要一个枚举。
-
Numeric协议没有定义划分。如果您使用FloatingPoint代替,那么您的除法运算符将编译。比较stackoverflow.com/q/49899377/1187415
标签: swift function operator-overloading numeric quadratic