扩展FloatingPoint的集合

时间:2018-02-20 16:04:51

标签: swift swift-protocols

我试图扩展一系列符合浮点数的元素来计算平均值。

extension Collection where Element: FloatingPoint {
    func sum() -> Element {
        return reduce(0, +)
    }

    func average() -> Element {
        return sum() / Int(count)
    }
}

sum()工作正常但average()有错误。

  

二元运算符' /'不能应用于类型的操作数   ' Self.Element'和' Int'

我不确定为什么会这样。 Self.ElementFloatingPoint。我希望能够分开这个。

(我也意识到这是一个被零除的问题,但我稍后会解决这个问题。)

1 个答案:

答案 0 :(得分:3)

你平均没有用,因为你试图将一些FloatingPoint类型除以整数。使用Element(count)创建相同类型的新元素进行划分。

  extension Collection where Element: FloatingPoint {
      func sum() -> Element {
        return reduce(0, +)
      }

      func average() -> Element {
        guard !isEmpty else { return 0 }
        return sum() / Element(count)
      }
    }

这是有效的,因为FloatingPoint协议声明了初始化程序,

public init(_ value: Int)

这适用于Swift 4.1,因为count是Int。对于早期版本的Swift使用,

  extension Collection where Element: FloatingPoint {
      func sum() -> Element {
        return reduce(0, +)
      }

      func average() -> Element {
        guard !isEmpty else { return 0 }
        return sum() / Element(Int(count))
      }

  }