[英]Finding sum of elements in Swift array
在 swift 中找到整数数组之和的最简单(最佳)方法是什么? 我有一个名为 multiples 的数组,我想知道倍数的总和。
这是我能找到的最简单/最短的方法。
斯威夫特 3 和斯威夫特 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 的运行方式。
Swift 3+一个衬垫来总结对象的属性
var totalSum = scaleData.map({$0.points}).reduce(0, +)
点是我试图减少的自定义对象scaleData中的属性
在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 或更高版本
我们可以简单地将序列元素约束到新的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
Swift3 已更改为:
let multiples = [...]
sum = multiples.reduce(0, +)
斯威夫特 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
这也有效:
let arr = [1,2,3,4,5,6,7,8,9,10]
var sumedArr = arr.reduce(0, combine: {$0 + $1})
print(sumedArr)
结果将是:55
斯威夫特 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 循环:
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、4 和 5
使用减少:
let totalAmount = yourTransactionsModelArray.reduce(0) { $0 + $1.amount}
用于理解目的的老式方法:
for (var i = 0; i < n; i++) {
sum = sum + Int(multiples[i])!
}
//其中n =数组中的元素数
一个可能的解决方案:为它定义一个前缀运算符。 就像 APL 中的 reduce "+/" 运算符(例如 GNU APL)
这里有点不同的方法。
使用协议 en 泛型类型允许我们在 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 版中测试)
斯威夫特 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 })
这对我有用。
把事情简单化...
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
完成它的另一种简单方法:
let sumOfMultiples = ar.reduce(0) { x, y in x + y }
print(sumOfMultiples)
对我来说,使用属性就是这样
let blueKills = match.blueTeam.participants.reduce(0, { (result, participant) -> Int in
result + participant.kills
})
@IBOutlet var valueSource: [MultipleIntBoundSource]!
private var allFieldsCount: Int {
var sum = 0
valueSource.forEach { sum += $0.count }
return sum
}
将此用于嵌套参数
对于对象数组中的元素总和
self.rankDataModelArray.flatMap{$0.count}.reduce(0, +)
快速找到整数数组总和的最简单(最佳)方法是什么? 我有一个称为倍数的数组,我想知道倍数的总和。
斯威夫特 3
从此处显示的所有选项中,这是对我有用的选项。
let arr = [6,1,2,3,4,10,11]
var sumedArr = arr.reduce(0, { ($0 + $1)})
print(sumedArr)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.