You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Swift:合并求和与乘法函数及用泛型替代Any的实现方案

Swift 合并乘法/求和函数及泛型优化方案

一、合并两个函数的实现

你的两个函数核心逻辑完全一致,仅reduce阶段的运算不同,只需把运算逻辑抽成闭包参数传入即可。另外注意原multiply函数存在bug:reduce初始值用0会导致结果永远为0,乘法的初始值应该是1。

// 通用聚合函数,抽离公共逻辑,接收初始值和运算闭包
func aggregate(_ values: [Any?], initialValue: Double, operation: (Double, Double) -> Double) -> Double {
    return values.filter { $0 is Numeric }
        .compactMap { ($0 as? Numeric)?.doubleValue } // 用compactMap替代map+可选绑定,自动过滤nil
        .reduce(initialValue, operation)
}

// 求和函数:基于通用聚合实现
func sum(_ values: [Any?]) -> Double {
    aggregate(values, initialValue: 0, operation: +)
}

// 乘法函数:基于通用聚合实现,修正初始值为1
func multiply(_ values: [Any?]) -> Double {
    aggregate(values, initialValue: 1, operation: *)
}

二、用泛型替代Any的可行方案

使用Any?会丢失类型安全性,泛型可以让类型检查提前到编译阶段,同时简化代码(无需再做is Numeric的类型判断):

基础泛型版本

// 泛型聚合函数,约束元素必须遵循自定义Numeric协议
func aggregate<Element>(_ values: [Element?], initialValue: Double, operation: (Double, Double) -> Double) -> Double where Element: Numeric {
    return values.compactMap { $0?.doubleValue } // 直接解包可选元素并提取doubleValue
        .reduce(initialValue, operation)
}

// 泛型求和
func sum<Element: Numeric>(_ values: [Element?]) -> Double {
    aggregate(values, initialValue: 0, operation: +)
}

// 泛型乘法
func multiply<Element: Numeric>(_ values: [Element?]) -> Double {
    aggregate(values, initialValue: 1, operation: *)
}

支持非可选数组的重载版本

如果需要处理非可选的数组元素,可以再重载一个无可选约束的版本:

func aggregate<Element: Numeric>(_ values: [Element], initialValue: Double, operation: (Double, Double) -> Double) -> Double {
    return values.map { $0.doubleValue }
        .reduce(initialValue, operation)
}

func sum<Element: Numeric>(_ values: [Element]) -> Double {
    aggregate(values, initialValue: 0, operation: +)
}

func multiply<Element: Numeric>(_ values: [Element]) -> Double {
    aggregate(values, initialValue: 1, operation: *)
}

这样调用时,数组元素必须是遵循Numeric的类型(如Int、Double、String),代码更简洁且类型安全。

内容的提问来源于stack exchange,提问作者Atif Shabeer

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.26 07:32:23