包含自定义类的数组之和(Swift)

0qx6xfy6  于 2023-02-03  发布在  Swift
关注(0)|答案(4)|浏览(112)

我正在寻找一种方法来获得数组中包含的类的值的总和。我的设置如下:

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, +)

问题是,如果类有很多其他的值,它会变得非常复杂,有没有人知道更好的解决方案?

s3fp2yjn

s3fp2yjn1#

你可以把你定制类数组压缩Map成整数数组,然后把数组的值减少到它的和。比如,

let sum = array.lazy.compactMap { $0.value }
            .reduce(0, +)
zi8p0yeb

zi8p0yeb2#

您可以在array上使用单个reduce

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

rdrgkggo3#

我会为你的类或结构创建一个包含值的协议,并将它的声明改为非可选的。

protocol Valueable {
    var value: Int { get }
}

然后,您需要使您的类符合该协议:

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

现在,您可以使用只读示例属性来扩展收集协议,以返回数组中所有元素的总和。
一个二个一个一个

    • 编辑/更新:**

另一种选择是扩展序列并添加generic sum method,该generic sum method接受其属性符合AdditiveArithmetic的密钥路径
或者向符合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
    }
}

用法:

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
w1e3prcc

w1e3prcc4#

捷径:
let sum = customArray.reduce(0) { $0 + $1.intValue }

相关问题