简体   繁体   English

Swift泛型扩展到多个类

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM