假设我有这样的事情:

var x: Int = 6
var y: Float = 11.5


因此,结果必须这样写

var result = Float(x) * y


要么

var result = x * Int(y)


这有道理吧?但是,我认为这有点笨拙,因此我正在尝试为此创建一些自定义运算符:

infix operator *~ { associativity left precedence 150 } //floating

func *~ (lhs: Float, rhs: Int) -> Float {
    return lhs * Float(rhs)
}

func *~ (lhs: Int, rhs: Float) -> Float {
    return rhs * Float(lhs)
}


infix operator *| { associativity left precedence 150 } //Integer

func *| (lhs: Float, rhs: Int) -> Int {
    return Int(lhs) * rhs
}

func *| (lhs: Int, rhs: Float) -> Int {
    return Int(rhs) * lhs
}


它可以工作,但是它们太多了,所以我试图为这些功能制作一个通用版本。到目前为止,我的尝试:

func *~ <T: FloatingPointType, V:IntegerType>(lhs: T, rhs: V) -> T {
    return lhs * T(rhs)
    // error:
    // Could not find an overload for 'init' that accepts the supplied arguments
}


有人可以帮忙吗?谢谢。

最佳答案

protocol Fraction {
    init(_ value: Double)
    var asDouble: Double { get }
}

extension Int     : Fraction { var asDouble : Double { return Double(self) } }
extension Double  : Fraction { var asDouble : Double { return self         } }
extension Float   : Fraction { var asDouble : Double { return Double(self) } }
extension CGFloat : Fraction { var asDouble : Double { return Double(self) } }

infix operator ** { associativity left precedence 170 }

func **(lhs:Int, rhs:Int) -> Int {
    return lhs * rhs
}
func **<T:Fraction, U:Fraction>(lhs:T, rhs:U) -> Double {
    return lhs.asDouble * rhs.asDouble

}

2 ** 2     // 4
2 ** 2.2   // 4.4
2.5 ** 2   //  5.0
2.2 ** 2.2 // 4.84

07-26 00:28