首页 > 解决方案 > 从数值泛型返回 Double 的平均值扩展

问题描述

假设我为同质类型数据的列创建协议和结构:

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)'

尝试转换为 Double 无效。任何关于最佳实践的建议都将不胜感激。

标签: swiftgenericsswift-protocols

解决方案


我需要使用BinaryIntegerorBinaryFloatingPoint协议,因为它们可以很容易地转换为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


推荐阅读