Инициализация строки из протокола BinaryFloatingPoint - PullRequest
0 голосов
/ 02 августа 2020

Я не уверен, что нахожусь на правильном пути, но я пытаюсь создать расширение BinaryFloatingPoint для расширения Float, Double ... Идея пришла после просмотра этой ссылки .

До сих пор я успешно создавал различные функции. Однако я изо всех сил пытаюсь инициализировать String с помощью generi c BinaryFloatingPoint.

Ради вопроса я прилагаю простой пример кода, чтобы показать, что я хочу сделать:

extension Numeric where Self: BinaryFloatingPoint {

    var toString: String {
        return String(self)
    }
    
}

, но я вижу следующую ошибку:

Нет точных совпадений при вызове инициализатора

Возможно ли это?

ДОБАВЛЕНО

Идея состоит в том, чтобы использовать его с общим c типом BinaryFloatingPoint

extension Numeric where Self: BinaryFloatingPoint {
    
    /// Retruns the string value of the BinaryFloatingPoint
    var toString: String {
        return String(describing: self)
    }
    
    /// Returns the number of decimals. It will be always greater than 0
    var numberOfDecimals: Int {
        return toString.count - String(Int(self)).count - 1
    }
    
}

Ответы [ 2 ]

3 голосов
/ 02 августа 2020

Метод String init ожидает конкретный тип.

Используйте вместо этого String Interpolation

extension Numeric where Self: BinaryFloatingPoint {

    var toString: String {
        return "\(self)"
    }
}
1 голос
/ 03 августа 2020

Нет необходимости расширять Numeric и / или ограничивать его протоколом BinaryFloatingPoint. Вы можете просто расширить протокол LosslessStringConvertible:

extension LosslessStringConvertible {
    var string: String { .init(self) }
}
let int = 19
int.string         // "19"
let double = 2.5
double.string   // "2.5"

Если вы хотите поддерживать типы CGFloat, а также Decimal, вы можете расширить протокол CustomStringConvertible:

extension CustomStringConvertible {
    var string: String { .init(describing: self) }
}
let cgFloat: CGFloat = 0.5
cgFloat.string         // "0.5"
let decimal: Decimal = 1.9
decimal.string         // "1.9"
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...