Estoy pensando en una manera de obtener la suma de los valores de las clases que están contenidas en una matriz. Mi configuración es la siguiente:
class CustomClass { var value: Int? init(value: Int) { self.value = value } } let object1 = CustomClass(value: 2) let object2 = CustomClass(value: 4) let object3 = CustomClass(value: 8) let array: [CustomClass] = [object1, object2, object3]Mi solución actual es la siguiente:
var sumArray = [Int]() for object in array { sumArray.append(object.value!) } let sum = sumArray.reduce(0, +)El problema es que se vuelve muy complejo con clases con muchos otros valores, ¿alguien sabe una solución mejor?
Puede compactMap su matriz de clase personalizada en una matriz de enteros y luego reducir esa matriz a su suma. Me gusta,
let sum = array.lazy.compactMap { $0.value } .reduce(0, +)Puede usar una sola reduce en la array .
let sumOfValues = array.reduce({$0 += ($1.value ?? 0)})Crearía un protocolo para su clase o estructuras que contenga un valor. Y cambie su declaración a no opcional.
protocol Valueable { var value: Int { get } }Luego, deberá hacer que su clase se ajuste a ese protocolo:
class CustomClass: Valueable { let value: Int init(value: Int) { self.value = value } }Ahora puede ampliar el protocolo de recopilación con una propiedad de instancia de solo lectura para devolver la suma de todos los elementos de su matriz.
extension Collection where Element: Valueable { var sum: Int { return reduce(0) { $0 + $1.value } } } let object1 = CustomClass(value: 2) let object2 = CustomClass(value: 4) let object3 = CustomClass(value: 8) let objects = [object1, object2, object3] let sum = objects.sum // 14editar/actualizar:
Otra opción es extender la secuencia y agregar un método de suma genérico que acepte una ruta clave cuya propiedad se ajuste a AdditiveArithmetic
o agregue un tipo asociado al protocolo que se ajuste a AdditiveArithmetic:
protocol Valueable { associatedtype Value: AdditiveArithmetic var value: Value { get } } extension Collection where Element: Valueable { var sum: Element.Value { reduce(.zero) { $0 + $1.value } } } class CustomClass: Valueable { let value: Decimal init(value: Decimal) { self.value = value } }Uso:
let object1 = CustomClass(value: 123.4567) let object2 = CustomClass(value: 12.34567) let object3 = CustomClass(value: 1.234567) let objects = [object1, object2, object3] let sum = objects.sum // 137.036937