当前位置: 首页 > 面试题库 >

类型应为通用函数采用什么协议,以在Swift中将任何数字类型作为参数?

方奕
2023-03-14
问题内容

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

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

不使用NSNumber


问题答案:

更新: 以下答案原则上仍然适用,但是Swift
4完成了数字协议的重新设计,因此通常不需要添加自己的数字协议。在构建自己的系统之前,请查看标准库的数字协议。

在Swift中,这实际上是不可能的。为此,您需要创建一个新协议,并使用您将在泛型函数中使用的任何方法和运算符进行声明。此过程将为您工作,但是确切的细节在一定程度上取决于您的通用函数的功能。这是获取数字n返回的函数的处理方法(n - 1)^2

首先,定义您的协议,使用运算符和一个接受一个的初始化程序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协议。您必须明确指出这一点-
Apple称其为“宣布扩展的协议采用”。我们将针对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协议作为通用约束来编写实际功能。

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


 类似资料:
  • 问题内容: 在Objective- C中,可以将符合协议的类指定为方法参数。例如,我可以有一个只允许符合的方法: 我找不到在Swift中执行此操作的方法(也许尚不可能)。您可以使用来指定多种协议,但是您又如何要求该对象属于特定类呢? 问题答案: 您可以将其定义为通用函数,并使用类型约束来同时要求类和协议。 斯威夫特4 Swift 3 (也适用于Swift 4) 迅捷2

  • 问题内容: 我想创建一个类,可以存储符合特定协议的对象。对象应存储在类型数组中。根据Swift文档协议可以用作类型: 由于它是一种类型,因此可以在允许使用其他类型的许多地方使用协议,包括: 作为函数,方法或初始化程序中的参数类型或返回类型 作为常量,变量或属性的类型 作为数组,字典或其他容器中项目的类型 但是,以下内容会生成编译器错误: 协议“ SomeProtocol”只能用作通用约束,因为它具

  • 问题内容: 在C#中,可以通过指定类型来调用泛型方法: Swift不允许您在调用通用方法时对它进行专门化处理。编译器希望依靠类型推断,因此这是不可能的: 我需要的是一种使用泛型将类型传递给函数并返回该类型对象的方法 这可行,但是不适合我想做的事: 编辑(澄清) 我可能不太清楚问题的实质,这全都是关于调用返回给定类型(任何类型)的函数的简单语法。 举一个简单的例子,假设您有一个Any数组,并创建了一

  • 问题内容: 我对一方面用于协议的关联类型的语法和另一方面用于泛型类型的语法之间的区别感到困惑。 例如,在Swift中,可以使用以下方式定义通用类型 而使用诸如 为什么后者不只是: 是否有某种深层的原因(或者也许是显而易见的,对我来说就迷失了),原因是该语言未采用后一种语法? 问题答案: 在开发人员列表中已对此进行了多次讨论。基本答案是关联类型比类型参数更灵活。虽然您在这里有一个类型参数的特定情况,

  • 目前,我的类型定义为: 我需要这样的东西: 但第二条不被接受。

  • 我必须将一个协议作为参数传递给一个函数。协议是泛型的,具有关联的类型。我找不到一个好办法。 我想要实现的基本上是在JSON中存储一个键值对。所以我有一个通用的数据类型协议,它设置/获取值(根据数据类型设置和获取) 在另一个协议中,我希望将这个泛型数据类型协议作为函数参数传递。 在下面的代码中,我得到的协议“dataType”只能用作泛型约束,因为它有自身或关联的类型要求