Заставить дженерики 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, поверх стандартных библиотек, не добавляя много накладных расходов?