Расширение для среднего для возврата Double от Numeric generic - PullRequest
0 голосов
/ 27 января 2019

Предположим, я создаю протокол и структуру для столбца однородно типизированных данных:

protocol Columnizable {
    associatedtype Item

    var name: String { get }
    var values: [Item] { get }

}

struct Column<T>: Columnizable {

    var name: String
    var values = [T]()

}

Я хотел бы создать расширение протокола, которое позволяет Numeric иметь функцию average, которая может вычислять среднее значение.values, если тип соответствует протоколу Numeric, например, Double и Int

extension Columnizable where Item: Numeric {

    func average() -> Double {
        return Double(sum()) / values.count
    }

    func sum() -> Item {
        return values.reduce(0, +)
    }

}

Моя попытка функции average не может быть скомпилирована из-за:

Cannot invoke initializer for type 'Double' with an argument list of type '(Self.item)'

Попытки разыграть удвоение не работают.Буду признателен за любые советы по передовому опыту.

1 Ответ

0 голосов
/ 27 января 2019

Мне нужно было использовать протоколы BinaryInteger или BinaryFloatingPoint, поскольку их можно легко преобразовать в Double.Как сказал @rob napier, тип Complex не будет конвертируемым Double.

extension Columnizable where Item: BinaryInteger {
    var average: Double {
        return Double(total) / Double(values.count)
    }
}

extension Columnizable where Item: BinaryFloatingPoint {
    var average: Item {
        return total / Item(values.count)
    }
}

stackoverflow.com / a / 28288619/2019221

...