因此,我有一个方法,其中包含3种不同类型的参数:
Int32,Int和Double。因此,想法是使用泛型来最小化接口
Int32
Int
Double
func resetProgressBarChunks<T:Numeric>(originalIterationCount: T) { guard let iCount = originalIterationCount as? Double else {return}
但是我已经意识到,是在运行时,Int32and Int参数实际上会使那失败guard let。这是有道理的,这只是我的一厢情愿。
guard let
但是,如果我尝试将a强制Numeric转换为双精度,编译器将吠叫:
Numeric
func resetProgressBarChunks<T:Numeric>(originalIterationCount: T) { guard let iCount = Double(originalIterationCount) else {return}
无法使用参数’(T)’调用类型’Double’的初始化程序
我认为这也是有道理的,因为没有Double的初始化程序需要Generic。
因此,看起来我将被迫编写具有不同参数类型的3种方法。在Int32和Int参数的类型,将只投入Double,然后调用Double方法。这真的是最好的方法吗?我真的希望我可以Numeric以某种方式利用
仅出于句法说明的目的,这里有一个示例,使它成为泛型并针对所有三种类型都达到Double:
func f<T:Numeric>(_ i: T) { var d = 0.0 switch i { case let ii as Int: d = Double(ii) case let ii as Int32: d = Double(ii) case let ii as Double: d = ii default: fatalError("oops") } print(d) }
但是,这是否比重载更好?在我看来,重载要好得多,因为有了泛型,我们就让一堆不需要的类型进入了门。数字合同是谎言。Double,Int和Int32的三重过载集会使编译器成为事实的源头。