Fazendo com que os genéricos Swift funcionem com funções sobrecarregadas

Eu estou tentando construir um tipo genéricoMyStruct<T> que pode usarFloat ouDouble para armazenamento interno. No inicializador, estou passando um argumento do tipo T (que pretendo serFloat ouDouble) Esse inicializador chama algumas funções trigonométricas, comosin() ecos(). Essas duas funções estão sobrecarregadas nas bibliotecas do sistema para fornecerFloat eDouble versões.

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

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

O problema é que não posso usá-los na minha estrutura genérica. Um caso despojado ficaria assim:

struct MyStruct<T> {
    var v:T

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

Porque:

Falha na execução do parque infantil: Página sem título.xcplaygroundpage: 9: 17: erro: não é possível chamar 'sin' com uma lista de argumentos do tipo '(T)' init (x: T) {v = sin (x)}

Page.xcplaygroundpage: 9: 17: note: existem sobrecargas para 'sin' com estas listas de parâmetros parcialmente correspondentes: (Float), (Double) init (x: T) {v = sin (x)}

Parece que deveria haver uma maneira de fazer isso funcionar, mas parece muitoessa situação. Onde os comentários sugerem, não há como exigir a existência de uma função global.

Eu posso forçar a situação usando uma construção como:

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

e colocando uma restrição em T que pode ser construída a partir deDouble, mas isso parece derrotar o objetivo de tornar oFloat versão da estrutura, que é reduzir o esforço de computação quando usado em um loop crítico de código.

Parece que isso teria sido mais fácil sesin() tinha sido definido na biblioteca como uma função genérica em vez de uma função sobrecarregada:

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

Mas é o que é.

Existe uma maneira de eu construir uma biblioteca que seja independente de Float / Double no topo das bibliotecas padrão sem adicionar muita sobrecarga?

questionAnswers(2)

yourAnswerToTheQuestion