Расширение массива с помощью обобщенного математического типа с плавающей запятой c - PullRequest
0 голосов
/ 28 марта 2020

Я хотел бы добиться следующего, но не могу исправить ошибку: «Не номинальный тип« Элемент »не поддерживает явную инициализацию»

Исходная попытка:

public extension Array where Element: FloatingPointMathType {


    func mean<Element>() -> Element  {
        let sum: Element = reduce (0.0, +) as! Element

        return sum / Element(count) // ==> Non-nominal type 'Element' does not support explicit initialization
    }
}

Кроме того, мне интересно, почему для этого требуется as! Element cast

. Для сравнения, следующая локальная функция компилируется без проблем:

    func mean<Element: FloatingPointMathType>(_ e: [Element]) -> Element  {
        let sum: Element = e.reduce (0.0, +)

        return sum / Element(e.count)
    }

1 Ответ

0 голосов
/ 28 марта 2020

Невозможно сказать, в чем конкретно проблема, потому что мы не знаем, как определяется ваш протокол FloatingPointMathType. В вашей реализации есть несколько проблем (в основном, вы не хотите определять обобщенную c функцию mean<Element>; расширение уже параметризовано для типа Element, а параметр generi c вводит имя нового типа, которое затеняет его (и этот новый тип не связан, поэтому вы ничего не можете с ним сделать).

Следующее работает с протоколом FloatingPoint стандартной библиотеки:

public extension Collection where Element: FloatingPoint {
  func mean() -> Element  {
    reduce(into: 0, +=) / Element(count) 
  }
}
...