Sum массива, содержащего пользовательский класс (Swift) - PullRequest
0 голосов
/ 15 февраля 2019

Я придумываю способ получить сумму значений классов, которые содержатся в массиве.Моя установка выглядит следующим образом:

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]

Мое текущее решение заключается в следующем:

var sumArray = [Int]()
for object in array {
    sumArray.append(object.value!)
}
let sum = sumArray.reduce(0, +)

Проблема в том, что он становится оченьсложный с классами со многими другими значениями, кто-нибудь знает лучшее решение?

Ответы [ 3 ]

0 голосов
/ 15 февраля 2019

Вы можете сжать ваш массив пользовательского класса в массив целых чисел, а затем уменьшить этот массив до его суммы.Мол,

let sum = array.lazy.compactMap { $0.value }
            .reduce(0, +)
0 голосов
/ 15 февраля 2019

Я бы создал протокол для вашего класса или структур, который содержит значение.И измените его объявление на необязательное.

protocol Valueable {
    var value: Int { get }
}

Тогда вам нужно будет привести свой класс в соответствие с этим протоколом:

class CustomClass: Valueable {
    let value: Int
    init(value: Int) {
        self.value = value
    }
}

Теперь вы можете расширить протокол сбора только для чтенияСвойство экземпляра, которое возвращает сумму всех элементов в вашем массиве.

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   // 14
0 голосов
/ 15 февраля 2019

Вы можете использовать один reduce на array.

let sumOfValues = array.reduce({$0 += ($1.value ?? 0)})
...