【发布时间】:2017-10-31 19:14:22
【问题描述】:
我想知道是否有任何其他方法可以在 Swift 扩展中显式初始化 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 一起工作,但当然这不再是通用的了。
有什么提示吗?
【问题讨论】:
-
首先不要使用count属性来检查你的数组是否为空。其次,使返回类型可选而不是返回-1。顺便说一句,您的方法应该做什么?
-
如果您返回 Int.返回
Element?并使用BinaryInteger或FloatingPoint而不是Numeric -
上面的算法是如何实现“查找重复”的,还不是很清楚。返回值的含义是什么?为什么它是一个整数(“重复”是怎么回事)?在这种情况下,“显式初始化”是什么意思?
Numeric包括用于从任何BinaryInteger转换的init?(exactly:)(并且count始终为Int,因此适用)。但很不清楚你的意思是这段代码做什么。 -
@RobNapier:可能是这样的任务“你有一个从1到n-1的n个数字的数组,其中恰好一个数字出现了两次。找到重复的元素。