Быстрое расширение дженериков для нескольких классов

Поэтому я хочу добавить общее расширение для 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)'

Любые советы о том, как справиться с этим?

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

Вы можете просто использовать 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)
Другие вопросы по тегам