Перегрузка оператора
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)
}
Гипотеза: Я думаю, что тот факт, что я использую оператор /
в декларациисам перегруженный оператор /
- несмотря на то, что он используется в рекламеifferent context - вызывает ошибку.
Последний вопрос:
Как мне разрешить ошибки, сохраняя при этом гибкость моих перегруженных операторов?
Бонусный вопрос 1: Если я могу (я думаю, что мне, вероятно, придется вернуть String
ввыполнить это), я также хотел бы сделать отдельную квадратичную функцию, которая может возвращать точное решение?
Бонус Вопрос 2: ТакжеЕсли кто-нибудь знает, как создать отдельную функцию, которая может решать уравнение кубического , а не квадратичного, это также будет оценено.