大佬教程收集整理的这篇文章主要介绍了使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)} }
因为:
看起来应该有办法使这项工作,但它感觉很像this situation.评论表明,没有办法要求存在全局功能.
我可以通过使用如下构造强制这种情况:
init(x:T){v=T(sin(Double(X)))}
并且在T上设置一个可以从Double构造的约束,但这似乎打败了构造结构的Float版本的目的,这是为了减少在关键代码循环中使用它时的计算工作量.
如果在库中将sin()定义为泛型函数而不是重载函数,感觉会更容易:
func sin<T:FloaTingPointType> (x:T) -> T
但是它就是这样啊.
@matt’s solution是一个很好的快速修复,但如果你想要一些更永久的东西,你可能想要考虑创建一个协议,然后扩展浮点类型,以便允许你使用泛型版本重载sin()函数.
protocol FloaTingPointMathType : FloaTingPointType { var _sinValue : Self { get } } extension Float : FloaTingPointMathType { var _sinValue : Float {return sin(self)} } extension Double : FloaTingPointMathType { var _sinValue : Double {return sin(self)} } extension CGFloat : FloaTingPointMathType { var _sinValue : CGFloat {return sin(self)} } func sin<T:FloaTingPointMathType>(x:T) -> T {return x._sinvalue}
我们必须在这里使用’shadow’计算属性来弥补我们不能简单地使用sin()作为协议要求的事实.它并不理想 – 但可能和你一样好.
struct MyStruct<T:FloaTingPointMathType> { var v : T init(x:T) { v = sin(X) } }
print(MyStruct(x: Float(3.0)).v) // 0.14112 print(MyStruct(x: Double(3.0)).v) // 0.141120008059867 print(MyStruct(x: CGFloat(3.0)).v) // 0.141120008059867
以上是大佬教程为你收集整理的使Swift泛型与重载函数一起玩全部内容,希望文章能够帮你解决使Swift泛型与重载函数一起玩所遇到的程序开发问题。
如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。
本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。