Swift 扩展和 'Element' 显式初始化

Swift Extension and 'Element' explicit initialization

我想知道是否有任何其他方法可以显式初始化 Swift 扩展中的 Element 对象?

例如我想这样做但是非标称类型 'Element' 不支持显式初始化

extension Array where Element: Numeric {
    func findDuplicate() -> Int {
        guard self.count > 0 else { return -1 }
        let sum = self.reduce(0, +)
        let expectedSum = Element((self.count - 1) * self.count / 2)
        return sum - expectedSum
    }
}

当然,如果我删除 expectedSum 赋值中的强制 Element 转换并让编译器使用 Int,我会在比较 sum (Element) 和 expectedSum (Int) 时得到一个错误

我可以很容易地让我的扩展与 where Element == Int 一起工作,但当然这不再是通用的。

有什么提示吗?

整数到 Numeric 类型的转换是用 init?(exactly:) 完成的。考虑 Leo 的建议:

extension Array where Element: Numeric {
    func findDuplicate() -> Element? {
        guard !isEmpty else { return nil }
        let sum = self.reduce(0, +)
        guard let expectedSum = Element(exactly: (count - 1) * count / 2) else { return nil }
        return sum - expectedSum
    }
}

另一方面,这似乎是一项编程任务 特别是关于 整数, 然后它可能更有意义 将元素类型限制为 BinaryInteger(并使用 Int 用于避免溢出的中间计算):

extension Array where Element: BinaryInteger {
    func findDuplicate() -> Element? {
        guard !isEmpty else { return nil }
        let sum = Int(reduce(0, +))
        let expectedSum = (count - 1) * count / 2
        return Element(sum - expectedSum)
    }
}

甚至Element == Int.