[英]Swift generics extension to multiple classes
So I want to add a generic extension to NSNumber,Int,Double and Float where the value is converted to a formatted String. 所以我想为NSNumber,Int,Double和Float添加一个通用扩展,其中值被转换为格式化的String。
I started by creating a custom protocol: 我从创建自定义协议开始:
protocol MyFormatConvertible {
var toMyFormat: String { get }
}
extension NSNumber: MyFormatConvertible {}
extension Double: MyFormatConvertible {}
extension Float: MyFormatConvertible {}
extension Int: MyFormatConvertible {}
Now I'm trying to add the formatting to the extension: 现在我正在尝试将格式添加到扩展名:
extension MyFormatConvertible {
public var toMyFormat: String {
let numberValue = NSNumber(value:self)
....
But this doesn't seem to work as I'm getting the error: 但这似乎不起作用,因为我得到错误:
Cannot invoke initializer for type 'NSNumber' with an argument list of type '(value: Self)' 无法使用类型为'(value:Self)'的参数列表调用类型'NSNumber'的初始值设定项
Any hints on how to tackle this? 关于如何解决这个问题的任何提示?
You can simply use String(describing: self)
to achieve that. 您可以简单地使用String(describing: self)
来实现这一点。
protocol MyFormatConvertible {
var toMyFormat: String { get }
}
extension MyFormatConvertible {
var toMyFormat: String {
return String(describing: self)
}
}
extension NSNumber: MyFormatConvertible {}
extension Double: MyFormatConvertible {}
extension Float: MyFormatConvertible {}
extension Int: MyFormatConvertible {}
print(1.toMyFormat)
print(1.2.toMyFormat)
print(1.234.toMyFormat)
print(NSNumber(value: 1.23456).toMyFormat)
There are several overloads for NSNumber(value:)
for the various number types, but there is no generic NSNumber(value:)
constructor. 对于各种数字类型, NSNumber(value:)
有几个重载,但是没有通用的NSNumber(value:)
构造函数。
A possible workaround could be to use the 可能的解决方法是使用
func string(for obj: Any?) -> String?
function of the "abstract" superclass Formatter
of NumberFormatter
which accepts any type of argument (but might return nil
): “抽象”超类的函数NumberFormatter
Formatter
接受任何类型的参数(但可能返回nil
):
protocol MyFormatConvertible {
var toMyFormat: String { get }
}
extension MyFormatConvertible {
var toMyFormat: String {
let formatter = NumberFormatter()
formatter.numberStyle = .spellOut // <-- Just for demonstration purposes!!
return formatter.string(for: self) ?? "\(self)"
}
}
extension NSNumber: MyFormatConvertible {}
extension Double: MyFormatConvertible {}
extension Float: MyFormatConvertible {}
extension Int: MyFormatConvertible {}
print(123.toMyFormat) // one hundred twenty-three
print(Float.pi.toMyFormat) // three point one four one five nine two five zero two five nine three nine nine
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.