Вызов метода в необязательном Double для преобразования в строку - PullRequest
0 голосов
/ 01 февраля 2019

Я написал это для того, чтобы легко форматировать числа с плавающей запятой в виде строк с разным уровнем точности.

extension FloatingPoint {
    func str(_ precision: Int) -> String {
        return String(format: "%."+String(precision)+"f", self as! CVarArg)
    }
}

Это прекрасно работает для не необязательных переменных с типами с плавающей запятой:

var myDouble: Double = 3.1415
var text = myDouble.str(2) // sets text = "3.14"

Есть ли способ заставить что-то подобное работать для необязательного Double?

var myNilDouble: Double? = nil
var text = myNilDouble.str(2) // I'd like it to set text = "" 

Я бы хотел, чтобы реализация поддерживала преобразование nil и не nilв строку.

Ответы [ 2 ]

0 голосов
/ 01 февраля 2019

Самым простым решением было бы использовать необязательную цепочку и объединение нулей:

var text = myNilDouble?.str(2) ?? ""

Несмотря на то, что вы можете получить много повторений этого паттерна, преимущество заключается в том, что вы лучше контролируете сценарий с нулем,возможно, в некоторых ситуациях вы захотите использовать "(null)" в качестве значения по умолчанию.

0 голосов
/ 01 февраля 2019

Вы не вызываете метод для 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 решает, как сказал Султан.)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...