gpt4 book ai didi

swift - 在 Swift 中,泛型函数的 Type 应该采用什么协议(protocol)来接受任何数字类型作为参数?

转载 作者:行者123 更新时间:2023-11-30 13:59:52 25 4
gpt4 key购买 nike

我想让一个函数在 Swift 中接受任何数字(Int、Float、Double,...)

func myFunction <T : "What to put here"> (number : T) ->  {
//...
}

不使用 NSNumber

最佳答案

更新:下面的答案原则上仍然适用,但 Swift 4 完成了数字协议(protocol)的重新设计,因此通常不需要添加自己的协议(protocol)。看看standard library's numeric protocols在构建自己的系统之前。

<小时/>

这实际上在 Swift 中是不可能的。为此,您需要创建一个新协议(protocol),并使用您将在通用函数中使用的任何方法和运算符进行声明。这个过程将适合您,但确切的细节将在一定程度上取决于您的通用函数的作用。下面介绍了如何对获取数字 n 并返回 (n - 1)^2 的函数执行此操作。

首先,定义您的协议(protocol),使用运算符和一个采用 Int 的初始值设定项(这样我们就可以减一)。

protocol NumericType {
func +(lhs: Self, rhs: Self) -> Self
func -(lhs: Self, rhs: Self) -> Self
func *(lhs: Self, rhs: Self) -> Self
func /(lhs: Self, rhs: Self) -> Self
func %(lhs: Self, rhs: Self) -> Self
init(_ v: Int)
}

所有数字类型都已经实现了这些,但此时编译器并不知道它们是否符合新的NumericType 协议(protocol)。你必须明确这一点——苹果称之为“通过扩展声明协议(protocol)采用”。我们将为 DoubleFloat 和所有整数类型执行此操作:

extension Double : NumericType { }
extension Float : NumericType { }
extension Int : NumericType { }
extension Int8 : NumericType { }
extension Int16 : NumericType { }
extension Int32 : NumericType { }
extension Int64 : NumericType { }
extension UInt : NumericType { }
extension UInt8 : NumericType { }
extension UInt16 : NumericType { }
extension UInt32 : NumericType { }
extension UInt64 : NumericType { }

现在我们可以使用 NumericType 协议(protocol)作为通用约束来编写实际的函数。

func minusOneSquared<T : NumericType> (number : T) -> T {
let minusOne = number - T(1)
return minusOne * minusOne
}

minusOneSquared(5) // 16
minusOneSquared(2.3) // 1.69
minusOneSquared(2 as UInt64) // 1

关于swift - 在 Swift 中,泛型函数的 Type 应该采用什么协议(protocol)来接受任何数字类型作为参数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33130872/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com