Swift泛型扩展到多个类

时间:2017-11-21 07:36:54

标签: swift generics protocols protocol-extension

所以我想为NSNumber,Int,Double和Float添加一个通用扩展,其中值被转换为格式化的String。

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

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”的初始值设定项   输入'(值:自我)'

有关如何解决此问题的任何提示?

2 个答案:

答案 0 :(得分:2)

您只需使用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) 即可实现。

Vue.prototype.$apiurl = '127.0.0.1:8000/api'

答案 1 :(得分:2)

NSNumber(value:)有各种各样的重载 数字类型,但没有通用的NSNumber(value:)构造函数。

可能的解决方法是使用

func string(for obj: Any?) -> String?

Formatter的“抽象”超类NumberFormatter的函数,它接受任何类型的参数(但可能会返回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