我正在尝试创建一个具有平均功能的通用Queue类,但是我无法这样做,因为我需要一个以某种方式说T(Int)
是有效操作的协议。
这是我的尝试
class Queue<T:Numeric & Comparable> {
private var array:[T]
.....
func average() -> T {
return sum() / T(array.count)
}
}
然而,由于显而易见的原因,编译器说我不能这样做,因为T不支持显式初始化。实现此行为的协议的名称是什么,或者我如何编写自己的代码?
答案 0 :(得分:1)
请注意,Numeric
协议还包含FloatingPoint
种类型,因此您应将Queue
泛型类型约束为BinaryInteger
。关于平均返回类型,您应该返回Double
而不是通用整数。您的Queue
课程应如下所示:
class Queue<T: BinaryInteger & Comparable> {
private var array: [T] = []
init(array: [T]) {
self.array = array
}
func sum() -> T {
return array.reduce(0, +)
}
func average() -> Double {
return array.isEmpty ? 0 : Double(Int(sum())) / Double(array.count)
}
// If you would like your average to return the generic type instead of Double you can use numericCast method which traps on overflow and converts a value when the destination type can be inferred from the context.
// func average() -> T {
// return sum() / numericCast(array.count)
// }
}
游乐场测试
let queue = Queue(array: [1,2,3,4,5])
queue.sum() // 15
queue.average() // 3
如果您想扩展Numeric
,BinaryInteger
或FloatingPoint
类型的数组,可以查看answer。