【发布时间】:2016-05-22 01:24:57
【问题描述】:
我正在尝试构建一个泛型类型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)}
}
因为:
Playground 执行失败:Untitled Page.xcplaygroundpage:9:17: 错误:无法使用“(T)”类型的参数列表调用“sin” 初始化(x:T){v=sin(x)}
Untitled Page.xcplaygroundpage:9:17:注意:“sin”的重载存在这些部分匹配的参数列表: (浮动),(双) 初始化(x:T){v=sin(x)}
似乎应该有办法让这项工作发挥作用,但感觉很像this situation。 cmets 建议没有办法要求存在全局函数。
我可以通过使用以下结构来强制这种情况:
init(x:T){v=T(sin(Double(x)))}
并对 T 施加约束,使其可以从 Double 构造,但这似乎违背了制作结构的 Float 版本的目的,即在将其用于代码的关键循环。
如果在库中将sin() 定义为泛型函数而不是重载函数,感觉会更容易:
func sin<T:FloatingPointType> (x:T) -> T
但事实就是如此。
有没有办法让我在标准库之上构建一个与 Float/Double 无关的库,而不会增加很多开销?
【问题讨论】:
-
“我有没有办法做到这一点而不会增加很多开销?”我不确定“this”应该是什么,但
sin是几个 C 函数,它们对 Swift 泛型(所以你不能使用占位符类型作为它的参数)或 Swift 协议(所以你可以'不要使用 FloatingPointType 作为其参数)。 -
@matt,我所说的“这个”是指在标准库之上创建一个与 Float/Double 无关的库。这似乎是对泛型的明显使用,但我只能做最基本的事情。