Swift泛型对多个类的扩展
所以我想给NSNumber、Int、Double和Float添加一个通用扩展名,将值转换为格式化字符串 我首先创建了一个自定义协议:Swift泛型对多个类的扩展,swift,generics,protocols,protocol-extension,Swift,Generics,Protocols,Protocol Extension,所以我想给NSNumber、Int、Double和Float添加一个通用扩展名,将值转换为格式化字符串 我首先创建了一个自定义协议: protocol MyFormatConvertible { var toMyFormat: String { get } } extension NSNumber: MyFormatConvertible {} extension Double: MyFormatConvertible {} extension Float: MyFormatConver
protocol MyFormatConvertible {
var toMyFormat: String { get }
}
extension NSNumber: MyFormatConvertible {}
extension Double: MyFormatConvertible {}
extension Float: MyFormatConvertible {}
extension Int: MyFormatConvertible {}
现在,我正在尝试向扩展添加格式:
extension MyFormatConvertible {
public var toMyFormat: String {
let numberValue = NSNumber(value:self)
....
但这似乎不起作用,因为我得到了错误:
无法使用参数列表调用类型“NSNumber”的初始值设定项
类型“(值:Self)”
关于如何解决这个问题的任何提示?您只需使用
String(description: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)
对于不同的 数字类型,但没有通用的
NSNumber(值:)
构造函数
一个可能的解决方法是使用
func string(for obj: Any?) -> String?
NumberFormatter
的“抽象”超类Formatter
的函数,它接受任何类型的参数(但可能返回nil
):
协议MyFormatConverable{
var toMyFormat:字符串{get}
}
扩展MyFormatConvertible{
变量toMyFormat:字符串{
let formatter=NumberFormatter()
formatter.numberStyle=.spellOut//这很简洁。但是,这本质上与仅仅以函数的方式调用字符串(description:)
到数字是一样的。我实际上想在该函数中使用Numberformatter(我想用货币符号将数字格式化为货币)@Lefteris:该函数中有一个数字格式,您可以根据需要进行配置。numberStyle=.spellOut
只是一个示例,用numberStyle=.currency
替换它。Martin,这似乎适用于NSNumber
、Double
和Int
,但不适用于Float
。我是g设置编译器错误:类型“Float”不符合协议“MyFormatConverable”
@Lefteris:是否添加了扩展Float:MyFormatConverable{}
?–上述代码是my(工作)的精确副本测试程序。马丁,我有。由于某种原因,在清理项目后,它确实编译了。没有意义,但它正在工作。谢谢你解决了我的问题
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