查找Swift数组中的元素总和

ejL*_*Lev 203 arrays swift

在swift中找到整数数组之和的最简单(最好)方法是什么?我有一个名为倍数的数组,我想知道倍数的总和.

use*_*tbd 431

这是我能找到的最简单/最短的方法.

Swift 3和Swift 4:

let multiples = [...]
let sum = multiples.reduce(0, +)
print("Sum of Array is : ", sum)
Run Code Online (Sandbox Code Playgroud)

斯威夫特2:

let multiples = [...]
sum = multiples.reduce(0, combine: +)
Run Code Online (Sandbox Code Playgroud)

更多信息:

这使用了Array的reduce方法(此处为文档),它允许您"通过递归应用提供的闭包将元素集合减少到单个值".我们给它0作为初始值,然后,基本上,闭包{ $0 + $1 }.当然,我们可以将其简化为单个加号,因为这就是Swift的滚动方式.

  • 谢谢你的回答.它工作得很好,我只想添加自定义类数组的示例代码:`let totalSum = self.cheques.reduce(0){$ 0 + $ 1.amount}` (36认同)
  • 很好的答案但缺少参数名称`combine`.应该是`multiples.reduce(0,combine:+)`. (2认同)
  • 它比for循环更快吗? (2认同)
  • @SwiftMatt 首先尝试在其上使用 `flatMap` 将其展平为一维数组。`multiArray.flatMap{$0}.reduce(0, combine: +)` (2认同)
  • @lorenzo - 在iPhone 7上测试最新的Swift和XCode(一个简单的阵列,填充了1,000,000个UInt32随机值,上限为256,以防止UInt32溢出)有趣地显示'for'循环只是一个头发更快(1.941秒对2.137秒)虽然这个优点是*不存在100,000个值(每个0.23秒).恕我直言,即使在处理32MB阵列时,代码清晰度也值得任何非常小的性能成本. (2认同)

Jes*_*uez 62

Swift 3/Swift 4 one liner用于求和对象的属性

var totalSum = scaleData.map({$0.points}).reduce(0, +)
Run Code Online (Sandbox Code Playgroud)

其中points是我想要减少的自定义对象scaleData中的属性

  • 你可以通过 `scaleData.reduce(0) { $0 + $1.points }` 来实现 (5认同)
  • 这将不必要地迭代整个集合两次 (3认同)

dev*_*ike 27

Swift3已改为:

let multiples = [...]
sum = multiples.reduce(0, +)
Run Code Online (Sandbox Code Playgroud)


Leo*_*bus 14

Swift 4中,您还可以将序列元素约束为Numeric协议,以返回序列中所有元素的总和,如下所示

extension Sequence where Element: Numeric {
    /// Returns the sum of all elements in the collection
    func sum() -> Element { return reduce(0, +) }
}
Run Code Online (Sandbox Code Playgroud)

编辑/更新:

Xcode 10.2•Swift 5或更高版本

我们可以简单地将序列元素限制为新的AdditiveArithmetic协议,以返回集合中所有元素的总和

extension Sequence where Element: AdditiveArithmetic {
    func sum() -> Element {
        return reduce(.zero, +)
    }
}
Run Code Online (Sandbox Code Playgroud)

Xcode 11•Swift 5.1或更高版本

extension Sequence where Element: AdditiveArithmetic {
    func sum() -> Element { reduce(.zero, +) }
}
Run Code Online (Sandbox Code Playgroud)
let numbers = [1,2,3]
numbers.sum()    // 6

let doubles = [1.5, 2.7, 3.0]
doubles.sum()    // 7.2
Run Code Online (Sandbox Code Playgroud)

  • 太棒了,很好的解决方案! (2认同)

Mar*_*ida 11

这也有效:

let arr = [1,2,3,4,5,6,7,8,9,10]
var sumedArr = arr.reduce(0, combine: {$0 + $1})
print(sumedArr)
Run Code Online (Sandbox Code Playgroud)

结果将是:55


Mac*_*wia 10

Swift 4的例子

class Employee {
    var salary: Int =  0
    init (_ salary: Int){
        self.salary = salary
    }
}

let employees = [Employee(100),Employee(300),Employee(600)]
var sumSalary = employees.reduce(0, {$0 + $1.salary}) //1000
Run Code Online (Sandbox Code Playgroud)


Luc*_*nzo 8

斯威夫特3

如果你有一个通用对象数组,并且想要总结一些对象属性,那么:

class A: NSObject {
    var value = 0
    init(value: Int) {
       self.value = value
    }
}

let array = [A(value: 2), A(value: 4)]      
let sum = array.reduce(0, { $0 + $1.value })
//                           ^       ^
//                        $0=result  $1=next A object
print(sum) // 6 
Run Code Online (Sandbox Code Playgroud)

尽管形式较短,但很多时候你可能更喜欢经典的for-cycle:

let array = [A(value: 2), A(value: 4)]
var sum = 0
array.forEach({ sum += $0.value}) 
// or
for element in array {
   sum += element.value
}
Run Code Online (Sandbox Code Playgroud)

  • 通过这种方式,您编写了更多代码并增加了复杂性.. 那么,为什么? (2认同)

Nai*_*hta 6

简单的方法怎么样?

for (var i = 0; i < n; i++) {
 sum = sum + Int(multiples[i])!
}
Run Code Online (Sandbox Code Playgroud)

//其中n =数组中元素的数量

  • 请注意,在 Swift 3 中,这不再有效,因为 C 样式的 for 循环已从语言中删除。使用 for-in 循环代替,Swift 在内部跟踪索引。 (2认同)