Вы не вызываете метод для Double
, вы вызываете его для Optional<Double>
;совершенно другой тип.Таким образом, вам нужен метод для существования на Optional
:
extension Optional where Wrapped : FloatingPoint {
func string(usingPrecision precision: Int) -> String {
guard let double = self else { return "" }
return double.str(precision)
}
}
Мне не нравится этот интерфейс;Я не думаю, что работа Optional
- создавать пустую строку.Вместо этого я бы предложил инициализатор на String
, который принимает Optional
с плавающей точкой:
import Foundation
extension String {
init<N : FloatingPoint>(_ value: N?, precision: Int) {
guard let value = value else { self.init(); return }
self.init(format: "%.\(precision)f", value as! CVarArg)
}
}
Теперь вы пишете
let value: Double? = nil
let text = String(value, precision: 2) // ""
Другой вариант - это бесплатная функция, снова принимаяOptional
.(Конечно, вы можете также сделать выбор вызывающего абонента в отношении того, к чему nil
решает, как сказал Султан.)