我有这个函数可以根据 2 个数字计算斜边
func hypotenusa<T>(nr1: T, nr2: T) -> T {
return sqrt( pow(nr1, 2) + pow(nr2, 2) )
}
// v Simpler situation v
func addition<T>(nr1: T, nr2: T) -> T {
return nr1 + nr2
}
我想使用泛型,所以我不必制作 3 个分别使用 Int、Float、Double 的副本
但这行不通,我认为泛型真的很难用,请帮助我:)
最佳答案
Swift 泛型不像 C++ 模板。
在 C++ 中,您可以随心所欲地尝试使用参数化类型,并且在编译器尝试使用某种不支持您的模板尝试执行的操作的类型实例化模板之前,这不是错误。
在 Swift 中,泛型构造只能以在首次解析泛型构造时已知有效的方式使用参数化类型。您通过使用协议(protocol)约束参数化类型来指定这些“已知有效的方式”。
您不能使用泛型参数调用 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
版本,因为标准库已经提供了一个hypot
函数在 Float
和 Double
上定义:
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
关于ios - Swift 数字泛型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28457230/