Después de consultar expertos en esta materia, programadores de diversas ramas y profesores dimos con la respuesta a la interrogande y la compartimos en esta publicación.
Solución:
Este es el método más fácil/más corto que puedo encontrar.
Rápido 3 y Rápido 4:
let multiples = [...]
let sum = multiples.reduce(0, +)
print("Sum of Array is : ", sum)
Rápido 2:
let multiples = [...]
sum = multiples.reduce(0, combine: +)
Algo más de información:
Esto utiliza el método de reducción de Array (documentación aquí), que le permite “reducir una colección de elementos a un solo valor aplicando recursivamente el cierre provisto”. Le damos 0 como valor inicial, y luego, esencialmente, el cierre $0 + $1
. Por supuesto, podemos simplificarlo a un solo signo más, porque así funciona Swift.
Rápido 3+ un trazador de líneas para sumar las propiedades de los objetos
var totalSum = scaleData.map($0.points).reduce(0, +)
Donde puntos es la propiedad en mi objeto personalizado scaleData que estoy tratando de reducir
En rápido 4 También puede restringir los elementos de la secuencia al protocolo numérico para devolver la suma de todos los elementos de la secuencia de la siguiente manera
extension Sequence where Element: Numeric
/// Returns the sum of all elements in the collection
func sum() -> Element return reduce(0, +)
editar/actualizar:
Xcode 10.2 • Swift 5 o posterior
Simplemente podemos restringir los elementos de la secuencia al nuevo protocolo AdditiveArithmetic para devolver la suma de todos los elementos de la colección.
extension Sequence where Element: AdditiveArithmetic
func sum() -> Element
return reduce(.zero, +)
Xcode 11 • Swift 5.1 o posterior
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
Para sumar una propiedad de un objeto personalizado, podemos extender Sequence para tomar un predicado para devolver un valor que se ajuste a AdditiveArithmetic
:
extension Sequence
func sum(_ predicate: (Element) -> T) -> T reduce(.zero) $0 + predicate($1)
Uso:
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