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

泛型作为快速关闭的参数

班言
2023-03-14
问题内容

我在编写以下函数作为闭包时遇到麻烦

func myfunc<S where S: MyProtocol, S: MySuperClass>(param: S) { ... }

我试过了

let myClosure = {<S where S: MyProtocol, S: MySuperClass>(param: S) in ... }

但这不起作用。

有什么建议?


问题答案:

我相信您要的东西没有任何意义(与Swift无关)。尽管我有兴趣证明自己是错误的,但我不认为可以用任何强类型语言合理地创建它。(编辑:继续我的研究,我相信使用一流的多态性的语言是可行的,但我不知道实际上有此功能的任何通用语言。)

let myClosure = {<S where S: MyProtocol, S: MySuperClass>(param: S) in ... }

您希望myClosure是哪种类型?泛型创建抽象类型。除非专业化,否则它不会成为真实类型。因此myClosure本身就是抽象类型。这就像要求一个抽象类的实例。“抽象”的全部要点是您无法构建一个。您可能会说的最好的一点是,myClosure它本身就是一种您需要实例化为真实实例的类型(但随后let没有任何意义;您不进行输入let)。

当您将其包装在中时struct,您真正要做的是创建一个抽象类型,当您创建实例时,它将专门化为实型。

现在,IMO(但目前看来是不可能的)有意义的是:

typealias Mapping<S> = S -> S
let identity: Mapping<Int> = { return $0 }

这是有道理的,因为您要定义一个抽象类型(Mapping),然后实例化一个具体类型Mapping<Int>。不幸的是,typealias目前似乎还不支持泛型,因此a
struct可能是我们拥有的最好的工具。

请注意,虽然typealias是半身像,但显然可以对函数变量本身进行专门化处理。我知道这不是闭包,但在某些情况下可能有用。

func Identity<T>(i:T) -> T {
  return i
}

let identityInt:(Int -> Int) = Identity
identityInt(1) // => 1

使用此方法进一步探讨抽象类型的问题,请考虑:

func Identity<T>(i:T) -> T { return i }
let x = Identity

这无法编译并显示以下错误:

error: cannot convert the expression's type '(T) -> T' to type '(T) -> T'

那是因为类型(T) -> T不是具体类型,所以您不能有一个叫做的类型x。与进行比较,identityInt我明确将其专门化为具体类型,然后可以进行构造。



 类似资料:
  • Keras泛型模型接口是用户定义多输出模型、非循环有向模型或具有共享层的模型等复杂模型的途径 这部分的文档假设你已经对Sequential模型已经比较熟悉 让我们从简单一点的模型开始 第一个模型:全连接网络 Sequential当然是实现全连接网络的最好方式,但我们从简单的全连接网络开始,有助于我们学习这部分的内容。在开始前,有几个概念需要澄清: 层对象接受张量为参数,返回一个张量。张量在数学上只

  • 我想使用泛型类作为另一个泛型类的类型参数。 起初,我对类的定义是这样的: 然后我的需求发生了变化,我不得不为我的R类型使用包装器/持有者类 到目前为止,我的尝试:(给出编译时错误:

  • 问题内容: 我正在对服务器进行API调用。我正在利用Alamofire来解决这个问题。我正在尝试创建一个使用Alamofire的GET函数返回基于自定义类的对象的函数,该类包含此GET函数提供的各种输出。 我不清楚执行此操作的方式。 这是我的自定义类,其中包含有关响应的详细信息: 在另一个类中,我具有以下功能: 这将返回,因为在执行之前对服务器的调用未完成。我知道我应该能够使用闭包来做到这一点,但

  • 问题内容: 您认为可以创建类似的东西吗? 问题答案: 是的你可以。 用法示例:

  • 我知道这样一个事实:如果将< code>closure赋给一个类的属性,并且在闭包内部使用了该类的实例属性,那么它可以创建< code>retain cycles。但是 1)闭包没有分配给类属性,而是作为参数传递给单例的类方法,这是怎么回事? 2) 在这种情况下如何管理内存? 在我的控制器(UIViewController)的方法中,我有类似的东西:

  • 我有一个表示数据元类型的接口类型。该参数指示将用于表示数据的Java类型: 我还有一个表示该类型实例的值接口: 所以想象一下,它是一个简单的类型来表示系统中的数字(还有更复杂的动态类型,除了在运行时不存在,这是元编程的乐趣所在): 它告诉调用方在系统中用来表示此类型的Java类型。如果声明的值: 我希望能够具有编译时安全性,使始终返回一个BigDecimal: 这样,如果我需要更改给定类型的Jav