Заставить дженерики Swift играть с перегруженными функциями

Я пытаюсь построить универсальный типMyStruct<T> которые могут использовать либоFloat или жеDouble для внутреннего хранения. В инициализаторе я передаю аргумент типа T (который я намерен либоFloat или жеDouble). Этот инициализатор вызывает некоторые триггерные функции, такие какsin() а такжеcos(), Обе эти функции перегружены в системных библиотеках, чтобы обеспечитьFloat а такжеDouble версии.

var f:Float=1.2
var d:Double=1.2

sin(f) //0.9320391
sin(d) //0.9320390859672263

Проблема в том, что я не могу использовать их в своей общей структуре. Урезанный корпус будет выглядеть так:

struct MyStruct<T> {
    var v:T

    init(x:T){v=sin(x)}
}

Так как:

Не удалось выполнить игровую площадку: без названия Page.xcplaygroundpage: 9: 17: ошибка: невозможно вызвать 'sin' со списком аргументов типа '(T)' init (x: T) {v = sin (x)}

Untitled Page.xcplaygroundpage: 9: 17: примечание: перегрузки для 'sin' существуют с этими частично совпадающими списками параметров: (Float), (Double) init (x: T) {v = sin (x)}

Кажется, должен быть способ заставить это работать, но это похоже наэта ситуация, Где комментарии предполагают, что нет никакого способа требовать существования глобальной функции.

Я могу форсировать ситуацию, используя такую ​​конструкцию, как:

init(x:T){v=T(sin(Double(x)))}

и наложение ограничения на T, что он может быть построен изDouble, но это, кажется, победит цель созданияFloat версия структуры, которая должна уменьшить вычислительные усилия, когда это используется в критическом цикле кода.

Такое ощущение, что это было бы проще, если быsin() был определен в библиотеке как универсальная функция, а не перегруженная функция:

func sin<T:FloatingPointType> (x:T) -> T

Но что есть, то есть.

Есть ли способ для меня, чтобы построить библиотеку, которая является независимой от Float / Double, поверх стандартных библиотек, не добавляя много накладных расходов?

Ответы на вопрос(2)

Ваш ответ на вопрос