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