2016-12-15 51 views
0

我執行(對於文章)兩個自定義綴運營商:最佳運營商定製與泛型類型約束的數值型

  • ¿% - 計算總的百分比。
  • %? - 計算表示一段總數的百分比。

調試一些錯誤和尋找信息後,我終於找到一個辦法讓我的代碼工作:

protocol NumericType { 
    static func *(lhs: Self, rhs: Self) -> Self 
    static func *(lhs: Self, rhs: Int) -> Self 
    static func /(lhs: Self, rhs: Self) -> Self 
    static func /(lhs: Self, rhs: Int) -> Self 
} // NumericType 

extension Double : NumericType { 
    internal static func *(lhs: Double, rhs: Int) -> Double { 
     return lhs * Double(rhs) 
    } 

    internal static func /(lhs: Double, rhs: Int) -> Double { 
     return lhs/Double(rhs) 
    } 
} 

extension Float : NumericType { 
    internal static func *(lhs: Float, rhs: Int) -> Float { 
     return lhs * Float(rhs) 
    } 

    internal static func /(lhs: Float, rhs: Int) -> Float { 
     return lhs/Float(rhs) 
    } 
} 

extension Int : NumericType { } 

infix operator ¿% 

func ¿% <T: NumericType>(percentage: T, ofThisTotalValue: T) -> T { 

    return (percentage * ofThisTotalValue)/100 

} // infix operator ¿% 

infix operator %? 

func %? <T: NumericType>(segmentOf: T, thisTotalValue: T) -> T { 

    return (segmentOf * 100)/thisTotalValue 

} // infix operator %? 

let percentage: Double = 8 
let price: Double = 45 

let save = percentage ¿% price 

print("\(percentage) % of \(price) $ = \(save) $") 

print("\(save) $ of \(price) $ = \(save %? price) %") 

...輸出:

8.0 % of 45.0 $ = 3.6 $ 
3.6 $ of 45.0 $ = 8.0 % 

我的問題是以下:

你認爲可能有更優化和可讀的方法嗎?

是嗎?你能提出一些建議還是分享一個例子?

+3

看來您的代碼按預期工作。如果您正在尋找可能改進的評論和建議,請在http://codereview.stackexchange.com上發佈。 –

+0

我會這樣做,謝謝你的建議。 –

回答

1

首先,我對使用自定義操作符持懷疑態度。 個人我寧願只是有一個函數,這樣的計算:

func percent(of partial: Double, from amount: Double) -> Double { 
    return partial/amount * 100 
} 

percent(of: 50, from: 100) 
// -> 50 

我覺得那將是長(短)期限爲可讀性和可維護性容易得多。

話雖如此......如果你確實想創建這些自定義操作符,我將如何處理它。

你走在正確的道路上!你會得到錯誤:

binary operator '*' cannot be applied to operands of type 'NumericType' and 'Double'

你去了實現功能,使*和/運營商可以在類型NumericTypeDouble使用的路徑。

但實際上,不是重新定義用於*和/以處理新類型的簽名,而是更容易找到從泛型類型獲取雙精度值並在計算中使用它的方法。

下面是它看起來可能:

protocol NumericType { 
    var doubleValue: Double { get } 
} 

infix operator ¿% 
infix operator %? 

func ¿% <T: NumericType>(percentage: T, ofTotal: Double) -> Double { 
    return percentage.doubleValue * ofTotal/100.0 
} 

func %? <T: NumericType>(segment: T, ofTotal: Double) -> Double { 
    return segment.doubleValue * 100/ofTotal 
} 

extension Double: NumericType { 
    var doubleValue: Double { return self } 
} 

extension Int: NumericType { 
    var doubleValue: Double { return Double(self) } 
} 

希望這會有所幫助,並請請請考慮使用標準函數,而不是這些運營商定製!