用自定义运算符覆盖types转换

假设我有这样的事情:

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 } 

它的工作原理,但有太多,所以我试图为这些function做一个通用的版本。 我到目前为止的尝试:

 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 

你所做的不仅仅是反作用。

你所说的笨拙是阻止最大的错误来源之一。 所以你要投入大量的时间和工作来解决这个问题,并且在这个过程中让你的源代码不可读。

任何人都掌握了你的源代码将首先花费几个小时撤消你的工作,把所有东西都变成正常的Swift代码。