Swift模糊重载+运算符

时间:2016-10-05 11:50:13

标签: swift xcode operator-overloading

这可能很简单,但有一个原因,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 个答案:

答案 0 :(得分: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.+,而不是你正在使用的全局函数+ ......