Swift 整数转换为泛型类型以计算平均值。非标称类型不支持显式初始化

Swift 整数转换为泛型类型以计算平均值。非标称类型不支持显式初始化,swift,Swift,我正在尝试创建一个具有平均函数的通用队列类,但是我在这样做时遇到了困难,因为我需要一个协议,该协议以某种方式表示T(Int)是一个有效的操作 这是我的尝试 class Queue<T:Numeric & Comparable> { private var array:[T] ..... func average() -> T { return sum() / T(array.count) } } 类队列{ 专用变量数组:

我正在尝试创建一个具有平均函数的通用队列类,但是我在这样做时遇到了困难,因为我需要一个协议,该协议以某种方式表示
T(Int)
是一个有效的操作

这是我的尝试

class Queue<T:Numeric & Comparable> {
    private var array:[T]
    .....
    func average() -> T {
        return sum() / T(array.count)
    }
}
类队列{
专用变量数组:[T]
.....
func average()->T{
return sum()/T(array.count)
}
}

然而,由于明显的原因,编译器说我不能这样做,因为T不支持显式初始化。实现此行为的协议的名称是什么,或者我如何编写自己的协议?

请注意,
数值
协议还包括
浮点
类型,因此您应该将
队列
泛型类型约束为
二进制Integer
。关于平均返回类型,您应该返回
Double
,而不是通用整数。您的
队列
类应如下所示:

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)
    // }

}


如果您想扩展
数值
二进制Integer
浮点
类型的数组,您可以检查此项。

但您并不是真的想要这样做,因为结果总是一个整数。您希望在队列中存储哪些类型?只有整数?还是浮点数?为什么需要基于
数组创建T.count
?这对我来说毫无意义。您想将除法转换为T型吗?怎么可能呢?例如,除法的结果如何总是整数?为什么你需要平均分为T?如果
average()
总是返回float,这还不够吗?@FyodorVolchyok完全可能是一种支持从
Int
初始化的类型(
array.count
)。可以编写代码,以便始终返回
Int
平均值,尽管这会导致truncation@Alexander我知道这段代码是可以写的。但这并不意味着它更明智。我不理解在什么情况下需要对一些通用数字数组进行四舍五入(以哪种方式?)平均。或者,这种舍入应该在文档中明确定义,或者从方法名称中显而易见(例如),您的答案假设了太多的东西。如果作者需要在队列中存储浮点数呢?标题说整数转换足够公平,我认为它只是错误的通用名称
let queue = Queue(array: [1,2,3,4,5])
queue.sum()       // 15
queue.average()   // 3