【问题标题】:Override typecasting with custom operators使用自定义运算符覆盖类型转换
【发布时间】:2015-03-24 04:00:27
【问题描述】:

假设我有这样的事情:

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
}

有人可以帮忙吗?谢谢。

【问题讨论】:

    标签: ios swift operator-overloading generics


    【解决方案1】:
    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
    

    【讨论】:

      【解决方案2】:

      你所做的不仅仅是适得其反。

      您所说的笨拙是防止最大的错误来源之一。因此,您需要投入大量时间和工作来撤消此操作,并使您的源代码在此过程中不可读。

      任何掌握了您的源代码的人都会首先花费数小时撤销您的工作并将所有内容转换为普通的 Swift 代码。

      【讨论】:

        猜你喜欢
        • 2014-05-16
        • 2013-06-12
        • 2013-07-10
        • 2016-12-16
        • 1970-01-01
        • 2022-01-16
        • 1970-01-01
        • 2019-03-13
        • 1970-01-01
        相关资源
        最近更新 更多