2015-12-26 63 views
0

我想添加一個round方法,將特定舍入位數添加到我的RealmOptional類中。如果你想方法添加到您的CGFloat類,你可以寫出如下(我借用它從this answer):如何擴展RealmOptional以在Swift中添加浮點函數?

public extension CGFloat { 
    func roundToDecimals(decimals: Int = 2) -> CGFloat { 
     let multiplier = CGFloat(10^decimals) 
     return round(multiplier * self)/multiplier 
    } 
} 

是否有可能將此功能添加到RealmOptional類,其中專用型定義爲Float必須添加該方法。

我不能讓它如何予以實施,但下面吐出錯誤:

Type 'T' constrained to non-protocol type 'Float'

import RealmSwift 
extension RealmOptional where T: Float { 
    func roundToDecimals(decimals: Int = 2) -> CGFloat { 
     let multiplier = CGFloat(10^decimals) 
     return round(multiplier * self.value!)/multiplier 
    } 
} 

回答

1

作爲一種變通方法,您可以定義一個協議,讓包裝類型實現一個和然後使用該協議作爲通用約束並委託給實現該值的方法,如下所示。

import QuartzCore 

protocol Roundable { 
    func roundToDecimals(decimals: Int) -> CGFloat 
} 

extension Float : Roundable { 
    func roundToDecimals(decimals: Int = 2) -> CGFloat { 
     let multiplier = pow(10.0, Float(decimals)) 
     return round(multiplier * CGFloat(self))/multiplier 
    } 
} 

extension RealmOptional where T: Roundable { 
    func roundToDecimals(decimals: Int = 2) -> CGFloat { 
     return self.value!.roundToDecimals(decimals) 
    } 
} 

但我建議,而不是使用maybeFloat.value!.roundToDecimals(2)使不安全力展開調用代碼清晰,而不是隱藏它走在執行。

+0

對不起遲到回覆,但我終於在Swift中得到了'^'不是'power'操作數! – Blaszard

+0

噢,對不起,甚至沒有想到這一點,只是接管了你在那裏。 – marius

相關問題