查找Swift数组中元素的和

在swift中找到整数数组的和的最简单(最好)的方法是什么? 我有一个数组叫multiples我想知道这些倍数的和

167535 次浏览

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

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: +)

更多信息:

这使用Array的reduce方法(文档在这里),该方法允许你“通过递归应用提供的闭包将元素集合减少到单个值”。我们给它0作为初始值,然后,本质上,闭包{ $0 + $1 }。当然,我们可以将其简化为一个加号,因为Swift就是这样运行的。

一个可能的解决方案:为它定义一个前缀运算符。 如APL(如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 Version 7.3中测试)

这也是可行的:

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

结果是:55

斯威夫特3、4、5

使用减少:

let totalAmount = yourTransactionsModelArray.reduce(0) { $0 + $1.amount}

老式的理解方法:

for (var i = 0; i < n; i++) {
sum = sum + Int(multiples[i])!
}

//where n =数组中元素的个数

Swift3已更改为:

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

斯威夫特3.0

我也有同样的问题,我在苹果的文档上找到了这个解决方案。

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 })

这对我很有用。

@IBOutlet var valueSource: [MultipleIntBoundSource]!


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

用于嵌套参数

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

斯威夫特3 +一行来求和对象的属性

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

哪里是属性在我的自定义对象scaleData,我试图减少

斯威夫特3

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

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




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

保持简单……

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

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

斯威夫特4中,您还可以将序列元素约束为数字协议,以返回序列中所有元素的和,如下所示

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或更高版本

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

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

Xcode 11•Swift 5.1或更高版本

extension Sequence where Element: AdditiveArithmetic {
func sum() -> Element { reduce(.zero, +) }
}

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


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

要对自定义对象的属性求和,可以扩展Sequence以接受一个谓词来返回符合AdditiveArithmetic的值:

extension Sequence  {
func sum<T: AdditiveArithmetic>(_ predicate: (Element) -> T) -> T { reduce(.zero) { $0 + predicate($1) } }
}

用法:

struct Product {
let id: String
let price: Decimal
}


let products: [Product] = [.init(id: "abc", price: 21.9),
.init(id: "xyz", price: 19.7),
.init(id: "jkl", price: 2.9)
]


products.sum(\.price)  // 44.5

用于对象数组中元素的和

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

对我来说,这就像使用财产

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

另一种简单的方法:

let sumOfMultiples = ar.reduce(0) { x, y in x + y }
print(sumOfMultiples)