数值协议的通用扩展名

时间:2019-06-28 01:56:20

标签: ios swift

我正在尝试使用一种将Swift类型的Numeric除以另一个相同类型的方法来扩展Swift的Numeric协议:

extension Numeric {
  func percentage<T>(of: T) -> T where T.Type == Self.Type {
    return self / of
  }
}

但是我得到了错误

  

相同类型的要求使通用参数'T'和'Self'等效

当它不是协议扩展时,它可以工作,但是我很想知道是否有可能将其作为扩展,以及该错误的含义。

这有效:

func percentage<T: Numeric>(n1: T, n2: T) -> T {
  return n1 / n2
}
let d = x(n1: 2.0, n2: 3.0)

2 个答案:

答案 0 :(得分:4)

不需要T

extension Numeric {
    func percentage<Self>(of whole: Self) -> Self {
        return self / whole
    }
}

答案 1 :(得分:2)

实际上,@ Alexander的答案对我不起作用,因为Numeric协议类型不支持除法。当将Numeric百分比值应用于整数除法时,其用途也很有限。

您可以通过将其限制为FloatingPoint协议来克服这些问题。另外请记住,这本身并不是一个百分比函数-乘以100即可得到,即:

extension FloatingPoint 
{
  func percentage(of whole: Self) -> Self
  {
    return (self / whole) * 100
  }
}