gpt4 book ai didi

swift - 我们如何创建一个通用的 Array Extension 来对 Swift 中的 Number 类型求和?

转载 作者:IT王子 更新时间:2023-10-29 05:10:15 31 4
gpt4 key购买 nike

Swift 允许您创建一个数组扩展,将整数与以下内容相加:

extension Array {
func sum() -> Int {
return self.map { $0 as Int }.reduce(0) { $0 + $1 }
}
}

现在可以用来对 Int[] 求和,例如:

[1,2,3].sum() //6

但我们如何才能制作一个通用版本来支持对其他数字类型(如 Double[] 求和)呢?

[1.1,2.1,3.1].sum() //fails

这个问题不是如何求和,而是如何创建通用数组扩展来完成。


越来越近

如果它能帮助任何人更接近解决方案,这是我能得到的最接近的:

您可以创建一个协议(protocol)来完成我们需要做的事情,即:

protocol Addable {
func +(lhs: Self, rhs: Self) -> Self
init()
}

然后扩展每个我们想要支持的符合上述协议(protocol)的类型:

extension Int : Addable {
}

extension Double : Addable {
}

然后添加具有该约束的扩展:

extension Array {
func sum<T : Addable>(min:T) -> T
{
return self.map { $0 as T }.reduce(min) { $0 + $1 }
}
}

现在可用于我们已扩展以支持该协议(protocol)的数字,即:

[1,2,3].sum(0) //6
[1.1,2.1,3.1].sum(0.0) //6.3

不幸的是,我无法在不提供参数的情况下让它工作,即:

func sum<T : Addable>(x:T...) -> T?
{
return self.map { $0 as T }.reduce(T()) { $0 + $1 }
}

修改后的方法仍然适用于 1 个参数:

[1,2,3].sum(0) //6

但是在不带参数调用方法时无法解析该方法,即:

[1,2,3].sum() //Could not find member 'sum'

Integer 添加到方法签名也无助于方法解析:

func sum<T where T : Integer, T: Addable>() -> T?
{
return self.map { $0 as T }.reduce(T()) { $0 + $1 }
}

但希望这会帮助其他人更接近解决方案。


一些进展

从@GabrielePetronella 的回答来看,如果我们在调用站点上明确指定类型,看起来我们可以调用上述方法,例如:

let i:Int = [1,2,3].sum()
let d:Double = [1.1,2.2,3.3].sum()

最佳答案

从 Swift 2 开始,可以使用协议(protocol)扩展来做到这一点。 (有关详细信息,请参阅 The Swift Programming Language: Protocols)。

首先是Addable协议(protocol):

protocol Addable: IntegerLiteralConvertible {
func + (lhs: Self, rhs: Self) -> Self
}

extension Int : Addable {}
extension Double: Addable {}
// ...

接下来,扩展 SequenceType 以添加 Addable 元素的序列:

extension SequenceType where Generator.Element: Addable {
var sum: Generator.Element {
return reduce(0, combine: +)
}
}

用法:

let ints = [0, 1, 2, 3]
print(ints.sum) // Prints: "6"

let doubles = [0.0, 1.0, 2.0, 3.0]
print(doubles.sum) // Prints: "6.0"

关于swift - 我们如何创建一个通用的 Array Extension 来对 Swift 中的 Number 类型求和?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24089450/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com