Я бы создал протокол для вашего класса или структур, который содержит значение.И измените его объявление на необязательное.
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