我想在round
课程中添加一个带有特定舍入数字的RealmOptional
方法。如果要将方法添加到CGFloat
类,可以编写以下内容(我从this answer借用):
public extension CGFloat {
func roundToDecimals(decimals: Int = 2) -> CGFloat {
let multiplier = CGFloat(10^decimals)
return round(multiplier * self) / multiplier
}
}
是否可以将此功能添加到RealmOptional
类中,其中只有必须将方法添加到Float
的类型。
我无法理解它是如何实现的,但是以下内容吐出了错误:
键入'T'约束为非协议类型'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
}
}
答案 0 :(得分: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)
在调用代码中清除不安全的强制解包,而不是将其隐藏在实现中。