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
我不知道你为什么要创建一个Int 版本,因为很少有直角三角形有整数斜边。
无论如何,您根本不需要定义Float 和Double 版本,因为标准库已经提供了在Float 和Double 上定义的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 函数存在相同的问题:+ 运算符没有完全通用定义。它有一些通用定义(与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