#swift #xcode #operator-overloading
#swift #xcode #оператор-перегрузка
Вопрос:
Вероятно, это так просто, но по какой-то причине swift не нравится моя реализация оператора …
У меня есть простой числовой протокол:
protocol Number : CustomStringConvertible {
var doubleValue: Double { get }
}
Простая реализация того же:
struct SimpleNumber : Number {
let doubleValue: Double
let description: String
init(_ double: Double) {
doubleValue = double
description = "(double)"
}
}
и расширение для перегрузки оператора:
extension Number {
static func (lhs: Number, rhs: Number) -> Number {
return SimpleNumber(lhs.doubleValue rhs.doubleValue)
}
}
Пока все хорошо. Но теперь, когда я пытаюсь использовать этот оператор:
let number1: Number = SimpleNumber(1)
let number2: Number = SimpleNumber(2)
let number3: Number = number1 number2;
Xcode сообщает мне, что оператор неоднозначен.
Итак, почему? Мое определение — единственное, которое подходит для двух Number
объектов.
Что я делаю не так?
Ответ №1:
Оператор не должен быть внутри расширения, а скорее глобальным func
. Замените ваше определение
:
extension Number {
static func (lhs: Number, rhs: Number) -> Number {
return SimpleNumber(lhs.doubleValue rhs.doubleValue)
}
}
с помощью простого
func (lhs: Number, rhs: Number) -> Number {
return SimpleNumber(lhs.doubleValue rhs.doubleValue)
}
и это будет работать. Я предполагаю, что вы создали статическую функцию Number.
, а не глобальную функцию
, которую вы используете…
Комментарии:
1.>
I guess what you have done is created a static function Number.
Также похоже, что добавление функции в протокол через расширение также добавляет новую функцию ко всем типам, реализующим это расширение с реализацией по умолчанию. Так что, возможно, код из вопроса создал две статические функции с одинаковой сигнатурой,Number.
иSimpleNumber.
последняя просто вызывает первую по умолчанию. Это может быть источником двусмысленности.