swift - 从数值泛型返回 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 无效。任何关于最佳实践的建议都将不胜感激。
解决方案
我需要使用BinaryInteger
orBinaryFloatingPoint
协议,因为它们可以很容易地转换为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)
}
}
推荐阅读
- excel - 检查一系列单元格,如果满足条件,则会出现消息框并撤消操作
- c# - EF Core 在每次迁移时更新种子数据而不进行更改
- javascript - 即使表单为假,ajax 也会成功触发
- sql - 获取包含特定名称的空值的额外行
- excel - 将整个数据模型“转储”为 Excel 工作表中的一个大表
- r - 帮助文件示例上的ggplotly“什么”错误
- c++ - 如何从 Windows 系统 certstore 中的证书获取公钥
- java - Spring Eclipse STS 糟糕的代码完成性能
- javascript - 正则表达式:在具有多语言支持的匹配模式后获取数字
- c++ - C++ - 模棱两可的重载模板解析/演绎