Можете ли вы написать универсальную функцию, которая будет сравнивать любой числовой тип (например, int, float, double) с нулем? - PullRequest
0 голосов
/ 27 апреля 2018

Мы пытаемся написать простую функцию усиления / убытка, которая возвращает цвет, основанный на значении относительно нуля. Если это положительно, мы возвращаем зеленый. Если отрицательный, мы возвращаем красный. Если ноль, мы возвращаем серый.

Текущая функция написана специально для двойного, например:

func getChangeColor(value:Double) -> UIColor {

    if value > 0 {
        return Theme.Colors.gain
    } else if value < 0 {
        return Theme.Colors.loss
    } else {
        return Theme.Colors.noChange
    }
}

Но мне интересно, можно ли его обновить, чтобы оно приняло любое числовое значение?

Моей первой мыслью было написать это против Comparable, но проблема в том, что нам нужно сравнить его с нулем в том же типе, что бы это ни было.

В других языках, таких как C #, вы можете получить значение по умолчанию для типа, которое в случае чисел равно нулю. У Свифта есть что-нибудь подобное? Если это так, мы могли бы сделать это ...

func getChangeColor<T:Comparable>(value:T) -> UIColor {

    let defaultValue = default(T.self)

    if value > defaultValue {
        return Theme.Colors.gain
    } else if value < defaultValue {
        return Theme.Colors.loss
    } else {
        return Theme.Colors.noChange
    }
}

... или этот подход вообще неверен?

1 Ответ

0 голосов
/ 27 апреля 2018

Мое решение добавляет второй протокол соответствия: Numeric предоставляет базовые арифметические операторы для скалярных типов.

Тогда вы можете вычислить нулевое значение в универсальном типе

func getChangeColor<T : Comparable & Numeric>(value:T) -> UIColor {

    let zero = value - value

    if value > zero {
        return Theme.Colors.gain
    } else if value < zero {
        return Theme.Colors.loss
    } else {
        return Theme.Colors.noChange
    }
}

или с switch заявлением

func getChangeColor<T : Comparable & Numeric>(value:T) -> UIColor {

    let zero = value - value

    switch value {
    case zero:  return Theme.Colors.noChange
    case zero...: return Theme.Colors.gain
    default: return Theme.Colors.loss
    }
}

или с троичным оператором (добавлено OP)

func getChangeColor<T : Comparable & Numeric>(value:T) -> UIColor {

    let zero = value - value

    return value > zero
        ? Theme.Colors.gain
        : value < zero
            ? Theme.Colors.loss
            : Theme.Colors.noChange
}
...