ios - Swift 数字泛型?

标签 ios swift generics

我有这个函数可以根据 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)约束参数化类型来指定这些“已知有效的方式”。

您不能使用泛型参数调用 sqrtpow,因为这些函数本身不是泛型的。它们各有两个定义:

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 版本,因为很少有直角三角形有整数斜边。

无论如何,你根本不需要定义FloatDouble版本,因为标准库已经提供了一个hypot函数在 FloatDouble 上定义:

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 函数有同样的问题:+ 运算符没有完全通用地定义。它有一些通用定义(不像 sqrtpow),但那些只涵盖整数类型(参见 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/

相关文章:

ios - Swift:动画 UIView 向源移动而不是远离它

ios - NSFileManager:试图删除文件,但它说它们不存在

c# - 有什么办法可以将这两种方法合并为一种方法,或者重载方法吗?

c# - 确定类 x 是否派生自类 y 的最简单方法? (C#)

ios - 在 Storyboard 中将 ViewController 嵌入另一个 ViewController

ios - UITableViewCell 中的 UITextView,无法取消自动更正

html - 使用 swift 进行 HTTP 发布。基本物联网应用程序

delphi - 将具有通用参数的类传递给Delphi中的另一个类

iOS。如何不将相同的代码放入三个几乎相同的 ViewControllers

ios - 如何找出 App Transport Security 阻止了哪些 HTTP 请求?