这是我能找到的最简单/最短的方法。
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就是这样运行的。
{ $0 + $1 }
这里有一点不同的方法。
使用泛型类型协议允许我们在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,我试图减少
从这里显示的所有选项中,这是对我有用的一个。
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的值:
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)