我编写此代码是为了轻松地将 float 格式化为具有不同精度级别的字符串。
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
float :
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 所说。)
关于swift - 调用可选 double 值上的方法以转换为字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54485013/