我試圖建立一個通用類型MyStruct<T>
,可以使用Float
或Double
作爲內部存儲。在初始化程序中,我傳遞了T型參數(我打算是Float
或Double
)。該初始化程序調用一些trig函數,如sin()
和cos()
。這兩種功能都在系統庫中過載以提供Float
和Double
版本。使Swift仿製藥玩重載函數
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)}
}
因爲:
Playground execution failed: Untitled Page.xcplaygroundpage:9:17: error: cannot invoke 'sin' with an argument list of type '(T)' init(x:T){v=sin(x)}
Untitled Page.xcplaygroundpage:9:17: note: overloads for 'sin' exist with these partially matching parameter lists: (Float), (Double) init(x:T){v=sin(x)}
好像應該有一種方法,使這項工作,但感覺很像this situation。評論表明,沒有辦法要求全球職能的存在。
我可以用一個結構,如受力情況:
init(x:T){v=T(sin(Double(x)))}
,並把約束上,它可以從Double
構造T,但似乎打敗使得Float
版本的目的的結構,這是爲了減少在關鍵代碼循環中使用時的計算量。
感覺就像這將是比較容易,如果sin()
曾在圖書館被定義爲一個通用的函數,而不是一個重載函數:
func sin<T:FloatingPointType> (x:T) -> T
但它是什麼。
有沒有一種方法可以讓我在標準庫之上建立一個Float/Double不可知的庫,而不會增加很多開銷?
我不確定「this」應該是什麼,但是'sin'是幾個C函數,它們對Swift泛型沒有任何認識(所以你不能使用佔位符類型作爲它的參數)或Swift協議(所以你可以不使用FloatingPointType作爲參數)。 – matt
@matt,「this」我的意思是創建一個浮點/雙精度不可知的庫,位於標準庫的頂部。這似乎是泛型的一種明顯的用法,但是我一直不能超過最基本的東西。 – Omegaman