Making Swift Generics spielen mit überladenen Funktionen

Ich versuche einen generischen Typ zu erstellenMyStruct<T> das kann entwederFloat oderDouble für internen Speicher. Im Initializer übergebe ich ein Argument vom Typ T (das ich entwederFloat oderDouble). Dieser Initialisierer ruft einige Triggerfunktionen wie @ ausin() undcos(). Beide Funktionen sind in den Systembibliotheken überladen, um @ bereitzustelleFloat undDouble versions.

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

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

Das Problem ist, ich kann sie nicht in meiner generischen Struktur verwenden. Ein abgespeckter Fall würde so aussehen:

struct MyStruct<T> {
    var v:T

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

Weil

Playground-Ausführung fehlgeschlagen: Untitled Page.xcplaygroundpage: 9: 17: Fehler: 'sin' kann nicht mit einer Argumentliste vom Typ '(T)' aufgerufen werden init (x: T) {v = sin (x)}

Untitled Page.xcplaygroundpage: 9: 17: Hinweis: Es gibt Überladungen für 'sin' mit diesen teilweise übereinstimmenden Parameterlisten: (Float), (Double) init (x: T) {v = sin (x)}

Es scheint, als gäbe es eine Möglichkeit, diese Arbeit zu machen, aber es fühlt sich sehr nach @ diese Situatio. Wo die Kommentare darauf hindeuten, dass es keine Möglichkeit gibt, die Existenz einer globalen Funktion zu fordern.

Ich kann die Situation erzwingen, indem ich ein Konstrukt verwende wie:

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

und eine Einschränkung für T, die aus einem @ konstruiert werden kaDouble, aber das scheint den Zweck zu besiegen, das @ zu machFloat -Version der Struktur, um den Rechenaufwand zu verringern, wenn diese in einer kritischen Codeschleife verwendet wird.

Es fühlt sich so an, als wäre dies einfacher gewesen, wennsin() wurde in der Bibliothek als generische Funktion und nicht als überladene Funktion definiert:

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

aber es ist was es ist.

Ist es für mich eine Möglichkeit, eine Bibliothek zu erstellen, die Float / Double Agnostic ist, ohne viel Aufwand zu verursachen?

Antworten auf die Frage(4)

Ihre Antwort auf die Frage