Swift泛型对多个类的扩展

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

所以我想给NSNumber、Int、Double和Float添加一个通用扩展名,将值转换为格式化字符串

我首先创建了一个自定义协议:

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