Swift泛型不像C++模板。
在C++中,你可以随意使用参数化类型,只有当编译器尝试使用一些不支持模板操作的类型来实例化模板时,才会出错。
而在Swift中,泛型构造只能以在首次解析泛型构造时已知为有效的方式使用参数化类型。你需要使用协议来限制参数化类型,以指定这些“已知为有效的方式”。
你不能使用泛型类型的参数调用sqrt
或pow
函数,因为这些函数本身不是泛型的。它们各自有两个定义:
func pow(_: Double, _: Double) -> Double
func pow(lhs: Float, rhs: Float) -> Float
func sqrt(x: Double) -> Double
func sqrt(x: Float) -> Float
你可以编写针对特定类型的
hypotenusa
版本:
func hypotenusa(a: Float, b: Float) -> Float
func hypotenusa(a: Double, b: Double) -> Double
func hypotenusa(a: CGFloat, b: CGFloat) -> CGFloat
我不确定为什么你要创建一个整数版本,因为很少有直角三角形的斜边是整数。
无论如何,你根本不需要定义浮点和双精度版本,因为标准库已经提供了在浮点和双精度上定义的hypot
函数:
func hypot(_: Double, _: Double) -> Double
func hypot(lhs: Float, rhs: Float) -> Float
您可以为CGFloat
创建另一个覆盖:
func hypot(l: CGFloat, r: CGFloat) -> CGFloat {
return hypot(Double(l), Double(r))
}
关于你的
addition
函数,它和你的
hypotenusa
函数一样存在问题:使用
+
运算符并不是完全通用的。虽然Swift有一些通用的定义(与
sqrt
和
pow
不同),但这些只包括整数类型(参见
IntegerArithmeticType
)。并没有泛型定义可以涵盖浮点数类型。Swift定义了所有这些版本的
+
都带有明确的类型:
func +(lhs: Float, rhs: Float) -> Float
func +<T>(lhs: Int, rhs: UnsafePointer<T>) -> UnsafePointer<T>
func +<T>(lhs: UnsafePointer<T>, rhs: Int) -> UnsafePointer<T>
func +(lhs: Int, rhs: Int) -> Int
func +(lhs: UInt, rhs: UInt) -> UInt
func +(lhs: Int64, rhs: Int64) -> Int64
func +(lhs: UInt64, rhs: UInt64) -> UInt64
func +<T>(lhs: Int, rhs: UnsafeMutablePointer<T>) -> UnsafeMutablePointer<T>
func +<T>(lhs: UnsafeMutablePointer<T>, rhs: Int) -> UnsafeMutablePointer<T>
func +(lhs: Int32, rhs: Int32) -> Int32
func +(lhs: UInt32, rhs: UInt32) -> UInt32
func +(lhs: Int16, rhs: Int16) -> Int16
func +(lhs: UInt16, rhs: UInt16) -> UInt16
func +(lhs: Int8, rhs: Int8) -> Int8
func +(lhs: UInt8, rhs: UInt8) -> UInt8
func +(lhs: Double, rhs: Double) -> Double
func +(lhs: String, rhs: String) -> String
func +(lhs: Float80, rhs: Float80) -> Float80