Быстрая неоднозначная перегрузка оператор

#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. последняя просто вызывает первую по умолчанию. Это может быть источником двусмысленности.