2016-10-05 2 views
2

Это, вероятно, так просто, но по причине Свифт не нравится моя реализация оператора + ...
у меня есть простой протокол номер: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.+, а не глобальную функцию +, которую вы используете ...

+0

Я знал, что это была глупая ошибка ... Спасибо! – Jofkos

+1

> 'Я предполагаю, что вы создали статическую функцию Number. +' Также похоже, что добавление функции в протокол через расширение также добавляет новую функцию для всех типов, реализующих это расширение с реализацией по умолчанию. Так что, возможно, код из вопроса создал ** две ** статические функции с одной и той же сигнатурой 'Number. +' * И * 'SimpleNumber. +', Последние просто вызывают прежние по умолчанию. Это * может быть * источником двусмысленности. – user28434

Смежные вопросы