为了方便将浮点数格式化为具有各种精度级别的字符串,我编写了此代码。
extension FloatingPoint {
func str(_ precision: Int) -> String {
return String(format: "%."+String(precision)+"f", self as! CVarArg)
}
}
它非常适合具有浮点类型的非可选变量:
var myDouble: Double = 3.1415
var text = myDouble.str(2) // sets text = "3.14"
有没有办法让类似这样的东西在可选件上工作Double
?
var myNilDouble: Double? = nil
var text = myNilDouble.str(2) // I'd like it to set text = ""
我希望该实现支持nil
并且不nil
转换为字符串。
您不是在上调用方法Double
,而是在上调用方法Optional<Double>
;完全不同的类型。因此,您需要该方法存在于Optional
:
extension Optional where Wrapped : FloatingPoint {
func string(usingPrecision precision: Int) -> String {
guard let double = self else { return "" }
return double.str(precision)
}
}
我不喜欢这个界面。我认为Optional
决定发出一个空字符串不是工作。相反,我建议使用String
一个Optional
浮点数的初始化程序:
import Foundation
extension String {
init<N : FloatingPoint>(_ value: N?, precision: Int) {
guard let value = value else { self.init(); return }
self.init(format: "%.\(precision)f", value as! CVarArg)
}
}
现在你写
let value: Double? = nil
let text = String(value, precision: 2) // ""
另一个选择是自由功能,再次使用Optional
。(nil
正如Sulthan所说,您当然也可以让呼叫者选择解决的方法。)
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句