查找Swift数组中的元素总和

时间:2014-07-17 04:53:31

标签: arrays swift

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

16 个答案:

答案 0 :(得分:391)

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

Swift 3和Swift 4:

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

斯威夫特2:

let multiples = [...]
sum = multiples.reduce(0, combine: +)

更多信息:

这使用了数组的reduce方法(文档here),它允许您通过递归应用提供的闭包来减少元素集合的下降到#34;。我们将它作为初始值给出0,然后基本上给出闭包{ $0 + $1 }。当然,我们可以将其简化为单个加号,因为Swift如何滚动。

答案 1 :(得分:44)

Swift 3 / Swift 4 一个衬垫,用于求和对象的属性

var totalSum = scaleData.map({$0.points}).reduce(0, +)

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

答案 2 :(得分:24)

Swift3已更改为:

let multiples = [...]
sum = multiples.reduce(0, +)

答案 3 :(得分:11)

这也有效:

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

结果将是:55

答案 4 :(得分:8)

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

答案 5 :(得分:7)

Swift 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 

尽管形式较短,但很多时候你可能更喜欢经典的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
}

答案 6 :(得分:6)

的简单方法怎么样?
if user.try(:admin?)
  # do something
end

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

答案 7 :(得分:6)

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

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

编辑/更新:

Xcode 10.2•Swift 5或更高版本

我们可以简单地将sequence元素约束到新的AdditiveArithmetic协议,以返回集合中所有元素的总和,如下所示

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

let doubles = [1.5, 2.7, 3.0]
doubles.sum()    // 7.2

答案 8 :(得分:2)

可能的解决方案:为其定义前缀运算符。 像在APL中的reduce“+ /”运算符(例如GNU APL)

这里有一点不同的方法。

使用协议通用类型允许我们在Double,Float和Int数组类型上使用此运算符

protocol Number 
{
   func +(l: Self, r: Self) -> Self
   func -(l: Self, r: Self) -> Self
   func >(l: Self, r: Self) -> Bool
   func <(l: Self, r: Self) -> Bool
}

extension Double : Number {}
extension Float  : Number {}
extension Int    : Number {}

infix operator += {}

func += <T:Number> (inout left: T, right: T)
{
   left = left + right
}

prefix operator +/ {}

prefix func +/ <T:Number>(ar:[T]?) -> T?
{
    switch true
    {
    case ar == nil:
        return nil

    case ar!.isEmpty:
        return nil

    default:
        var result = ar![0]
        for n in 1..<ar!.count
        {
            result += ar![n]
        }
        return result
   }
}

像这样使用:

let nmbrs = [ 12.4, 35.6, 456.65, 43.45 ]
let intarr = [1, 34, 23, 54, 56, -67, 0, 44]

+/nmbrs     // 548.1
+/intarr    // 145

(针对Swift 2.2更新,在Xcode版本7.3中测试)

答案 9 :(得分:2)

Swift 3.0

我有同样的问题,我在Apple这个解决方案的文档中找到了。

let numbers = [1, 2, 3, 4]
let addTwo: (Int, Int) -> Int = { x, y in x + y }
let numberSum = numbers.reduce(0, addTwo)
// 'numberSum' == 10

但是,在我的情况下,我有一个对象列表,然后我需要转换我的列表值:

let numberSum = self.list.map({$0.number_here}).reduce(0, { x, y in x + y })

这项工作对我而言。

答案 10 :(得分:0)

@IBOutlet var valueSource: [MultipleIntBoundSource]!

private var allFieldsCount: Int {
    var sum = 0
    valueSource.forEach { sum += $0.count }
    return sum
}

将此项用于嵌套参数

答案 11 :(得分:0)

对我来说,就像这样使用属性

    let blueKills = match.blueTeam.participants.reduce(0, { (result, participant) -> Int in
        result + participant.kills
    })

答案 12 :(得分:-1)

Swift 3

从这里显示的所有选项中,这个对我有用。

let arr = [6,1,2,3,4,10,11]


var sumedArr = arr.reduce(0, { ($0 + $1)})
print(sumedArr)

答案 13 :(得分:-2)

保持简单......

var array = [1, 2, 3, 4, 5, 6, 7, 9, 0]
var n = 0
for i in array {
    n += i
}
print("My sum of elements is: \(n)")

输出:

  

我的要素总和是:37

答案 14 :(得分:-2)

对象数组中的元素总和

self.rankDataModelArray.flatMap{$0.count}.reduce(0, +)

答案 15 :(得分:-3)

这是我对此的处理方法。 但我相信最好的解决方案是用户用户名tbd

的答案
var i = 0 
var sum = 0
let example = 0
for elements in multiples{
    i = i + 1
    sum = multiples[ (i- 1)]
    example = sum + example
}