如何扩展RealmOptional以在Swift中的Float上添加函数?

时间:2015-12-26 08:49:39

标签: ios swift generics realm

我想在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
    }
}

1 个答案:

答案 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)在调用代码中清除不安全的强制解包,而不是将其隐藏在实现中。