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
.
我想知道是否有任何其他方法可以显式初始化 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
.