我不确定我是否走在正确的道路上,但我正在尝试创建一个BinaryFloatingPoint扩展,以扩展Float,Double。。。这个想法是在看到那个链接之后产生的。
到目前为止,我已经创建了不同的功能,并取得了一定程度的成功。然而,我很难用通用BinaryFloatingPoint初始化字符串。
为了解决这个问题,我附上了一些简单的示例代码来展示我想做的事情:
extension Numeric where Self: BinaryFloatingPoint {
var toString: String {
return String(self)
}
}
但我看到以下错误:
调用初始值设定项时没有完全匹配
这可能吗?
添加
其想法是将其与通用BinaryFloatingPoint类型一起使用
extension Numeric where Self: BinaryFloatingPoint {
/// Retruns the string value of the BinaryFloatingPoint
var toString: String {
return String(describing: self)
}
/// Returns the number of decimals. It will be always greater than 0
var numberOfDecimals: Int {
return toString.count - String(Int(self)).count - 1
}
}
Stringinit
方法需要一个具体的类型。
使用字符串插值代替
extension Numeric where Self: BinaryFloatingPoint {
var toString: String {
return "(self)"
}
}
无需扩展Numeric
和/或将其约束到BinaryFloatingPoint
协议。您可以简单地扩展LosslessStringConvertible
协议:
extension LosslessStringConvertible {
var string: String { .init(self) }
}
let int = 19
int.string // "19"
let double = 2.5
double.string // "2.5"
如果您想支持CGFloat
和Decimal
类型,您可以扩展CustomStringConvertible
协议:
extension CustomStringConvertible {
var string: String { .init(describing: self) }
}
let cgFloat: CGFloat = 0.5
cgFloat.string // "0.5"
let decimal: Decimal = 1.9
decimal.string // "1.9"