具有二进制运算的通用函数

时间:2018-04-18 12:09:44

标签: swift generics protocols

我有以下函数返回数组的规范化版本,其元素可以是Int,Double,Float。

我收到下面第5行所示的错误。我认为Numeric协议会解决二进制操作,但我猜不是。我做错了什么?

L = {0,1}*1{0,1}^n

感谢

1 个答案:

答案 0 :(得分:1)

Numeric 协议需要加法,减法和乘法运算符,  但不是分部操作员。

我不知道一个协议需要一个整数和浮点类型都符合的除法运算符,因此你必须这样做 实现两个重载函数:

func normalizeArray<T: FloatingPoint>(a: [T]) -> [T] { ... }

func normalizeArray<T: BinaryInteger>(a: [T]) -> [T] { ... }

请注意,如果调用为空,则实现将崩溃 数组,我建议

func normalizeArray<T: BinaryInteger>(a: [T]) -> [T] {
    guard let min = a.min(), let max = a.max() else {
        return []
    }
    return a.map({ ($0 - min) / (max - min) })
}